<<Программирование на Ruby
Занятие 3: Методы для работы с контейнерами
- Прошло:
- суббота, 2010.12.04, 15:00
Домашнее задание
- Прочитать
- Написать метод
gcd
вычисления наибольшего общего делителя для класса Integer
. Нужно, чтобы 12.gcd(32)
давало 4
.
Материалы занятия
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 way | Ruby 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 way | Ruby 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 way | Ruby way |
---|
# факториал
f = 1
for i in (1..10)
f *= i
end
puts f
|
# факториал
puts (1..10).inject {|a,b| a*b}
|
C way | Ruby 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