Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
(hashfresult] ||= []) << x
end
hash
end
end
nums = [1,2,3,4,5,6,7,8,9]
mod3 = nums.classify {|x| x % 3 }
# { 0=>[3,6,9], 1=>[1,4,7], 2=>[2,5,8] }
words = %w( area arboreal brick estrous clear donor ether filial
patina ]
vowels = words.classify {|x| x.count("aeiou") }
# {1=>["brick"], 2=>["clear", "donor", "ether"],
# 3=>["area", "estrous", "filial", "patina"], 4=>["arboreal"]}
initials = words.classify {|x| x[0..0] }
# {"a"=>["area", "arboreal"], "b"=>["brick"], "c"=>["clear"],
# "d"=>["donor"], "p"=>["patina"], "e"=>["estrous", "ether"],
# "f"=>["filial"]}
8.3.4. Обход с группировкой
До сих пор мы обходили список по одному элементу за раз. Но иногда желательно на каждой итерации анализировать по два, три или более элементов.
Итератор
each_slice
enumerator
require 'enumerator'
arr = [1,2,3,4,5,6,7,8,9,10]
arr.each_slice(3) do |triple|
puts triple.join(",")
end
# Выводится:
# 1,2,3
# 4,5,6
# 7,8,9
# 10
Имеется также итератор
each_cons
require 'enumerator'
arr = [1,2,3,4,5,6,7,8,9,10]
arr.each_cons(3) do |triple|
puts triple.join(",")
end
# Выводится:
# 1,2,3
# 2,3,4
# 3,4,5
# 4,5,6
# 5,6,7
# 6,7,8
# 7,8,9
# 8,9,10
8.3.5. Преобразование в массив или множество
Каждая перечисляемая структура теоретически может быть тривиально преобразована в массив (методом
to_a
hash = {1=>2, 3=>4, 5=>6}
arr = hash.to_a # [[5, 6], [1, 2], [3, 4]]
Синонимом
to_a
entries
Если была затребована библиотека
set
to_set
require 'set'
hash = {1=>2, 3=>4, 5=>6}
set = hash.to_set # #<Set: {[1, 2], [3, 4], [5, 6]}>
8.3.6. Энумераторы
Объект класса
Enumerator
Enumerable
В следующем искусственном примере в классе
Foo
yield
every
each
require 'enumerator'
class Foo
def every
yield 3
yield 2
yield 1
yield 4
end
end
foo = Foo.new
# Передается объект и имя итератора...
enum = Enumerable::Enumerator, new(foo, :every)
enum.each {|x| p x } # Печатаются элементы
array = enum.to_a # [3,2,1,4]
sorted = enum.sort # [1,2,3,4]
Преобразование выглядит загадочно, но, по сути, это не что иное как:
enum = []
foo.every {|x| enum << x }
В примере выше
enum
Enumerator
Enumerable