Раздел «Язык Ruby».RubySchoolSourceL03:
<<Программирование на Ruby

Занятие 3: Методы для работы с контейнерами

Следующее занятие
Предыдущее занятие

Домашнее задание

Материалы занятия

puts "Hello"

5.times do 
  puts "Hello"
end

puts 1.class
puts 1.5.class
puts "abc".class
puts [1,3,2].class

# массив может содержать элементы разных классов!!
# это верно для многих контейнеров: Array, Set, Hash
[1, 1.5, "abc", [1,3,2]].each do |element|
  puts element.inspect
  puts element.class
end

C wayRuby way
# максимум

ary = [2,1,22,3,4]
max = ary.first
for i in a
  if max < i
    max = i
  end
end
puts max

# максимум
ary = [2,1,22,3,4]
puts ary.max

C wayRuby way
# сумма элементов
ary = [2,1,22,3,4]
sum = 0
for i in ary
  sum += i
end
puts sum
# сумма элементов
ary = [2,1,22,3,4]
puts ary.inject {|a,b| a + b }

C wayRuby way
# факториал
f = 1
for i in (1..10)
  f *= i
end
puts f
# факториал
puts (1..10).inject {|a,b| a*b}

C wayRuby way
# верно ли, что все элементы положительны?
ary = [2,1,-22,3,4]
flag = true
for i in ary
  if i <= 0
    flag = false
  end
end
puts flag
# верно ли, что все элементы положительны?
ary = [2,1,-22,3,4]
puts ary.all?{|a| a > 0 }

ary = [2,1,22,3,4]
puts ary.inject {|a,b| a * b }

Базовые методы контейнеров на примере Array

ary = [2,1,-22,3,1,4,2] 

ary.min   # минимальный элемент
ary.max   # максимальный элемент


ary.inject{|lv,v| ... } # АГРЕГИРОВАТЬ

ary.inject{|a,b| a+b} # СУММА всех элементов

["abc", " ", "klm"].inject{|a,b| a+b} # КОНКАТЕНАЦИЯ строк массива
[[1,2,3], [4,5], [6]].inject{|a,b| a+b} # КОНКАТЕНАЦИЯ  массивов

ary.map{|i| i**2}  # ПРЕОБРАЗОВАТЬ (вычислить квадраты от элементов)
ary.map!{|i| i**2} # <-- меняет сам массив; есть только в Array

ary.sort {|a,b| a.abs <=> b.abs}  # ОТСОРТИРОВАТЬ массив
ary.sort! {|a,b| a.abs <=> b.abs} # <-- меняет сам массив; есть только в Array

# ary.sort_by {|a| a.name.downcase}  # ОТСОРТИРОВАТЬ по атрибуту name независимо от регистра

ary.uniq  # УБРАТЬ ДУБЛИКАТЫ 
ary.uniq! # меняет сам массив; есть только в Array

ary.all? {|i| i > 0}  # ВСЕ ЛИ элементы положительны?
ary.any? {|i| i < 0}  # ЕСТЬ ЛИ ХОТЯ БЫ ОДИН отрицательный?

Определение метода sum для всех контейнеров

ary = [2,1,-22,3,4] 
range = (1..10)

module Enumerable
  def sum
    self.inject{|a,b| a+b}
  end
end

puts ary.sum
puts range.sum

ary  = [1, 2, 3]  

puts ary.sum #=> 6

ary  = ["a", "b", "c"]

puts ary.sum #=> "abc"

ary  = [[1,2], ["a", "b"]]

puts ary.sum #=> [1, 2, "a", "b"]

Неправильный, страшный, но интересный способ определения метода sum для нескольких классов (для Array и Range):

ary = [2,1,-22,3,4] 
range = (1..10)

[Array, Range].each do |klass|
  klass.class_eval do
    def sum
      self.inject{|a,b| a+b}
    end
  end
end

puts ary.sum
puts range.sum
end

Следующее занятие
Предыдущее занятие