Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
(hashfresult] ||= []) << x end hash endendnums = [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 filialpatina ]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_sliceenumeratorrequire '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_consrequire '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,108.3.5. Преобразование в массив или множество
Каждая перечисляемая структура теоретически может быть тривиально преобразована в массив (методом
to_ahash = {1=>2, 3=>4, 5=>6}arr = hash.to_a # [[5, 6], [1, 2], [3, 4]]Синонимом
to_aentriesЕсли была затребована библиотека
setto_setrequire 'set'hash = {1=>2, 3=>4, 5=>6}set = hash.to_set # #<Set: {[1, 2], [3, 4], [5, 6]}>8.3.6. Энумераторы
Объект класса
EnumeratorEnumerableВ следующем искусственном примере в классе
Fooyieldeveryeachrequire 'enumerator'class Foo def every yield 3 yield 2 yield 1 yield 4 endendfoo = 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 }В примере выше
enumEnumeratorEnumerable
