Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Если затребована библиотека
enumeratorobjectenum_forenum = fоо.enum_for(:every)Мы уже видели, как итераторы
each_sliceeach_consenum_sliceenum_conseachEnumerable::Enumerator.newenum_forarray = [5,3,1,2]discrete = array.enum_slice(2)# To же, что Enumerable::Enumerator.new(array,:each_slice,2)overlap = array.enum_cons(2)# To же, что Enumerable::Enumerator.new(array,:each_cons,2)discrete.each {|x| puts x.join(",") }# Выводится:# 5,3# 1,2overlap.each {|x| puts x.join(",") )# Выводится:# 5,3# 3,1# 1,28.3.7. Объекты-генераторы
Идея генератора довольно интересна. Обычный итератор в Ruby является внутренним, он запускает некоторый алгоритм, повторно вызывая блок кода.
Но бывают также и внешние итераторы. В этом случае алгоритм запускается самой программой, а итератор поставляет данные «по запросу», а не в соответствии с собственным «графиком».
В качестве аналогии можно рассмотреть метод
getlineIOeach_lineИногда внутренние итераторы не вполне подходят. Они позволяют решить задачу, но не лучшим способом. Внешний итератор был бы удобнее.
Библиотека
generatornextrewindend?IOrequire 'generator'array = [7,8,9,10,11,12]gen = Generator.new(array)what = gen.current # 7where = gen.index # 0 (то же, что pos)while gen.end? and gen.current <11 gen.nextendputs gen.current # 11puts gen.next # 11puts gen.index # 4 (index - то же, что pos)puts gen.next? # true (next? - то же, что end?)puts gen.next # 12puts gen.next? # falseОбратите внимание, как мы «читаем» набор по одному элементу в одном или нескольких циклах. Метод
end?EOFErrorend?next?Метод
indexposМетоды
currentnextcurrentnextcurrentПоскольку для многих наборов возможно только продвижение в прямом направлении, то и генератор ведет себя так же. Не существует метода
prevrewindНедостаток библиотеки
generatorcontinuation8.4. Заключение
Мы подробно рассмотрели массивы, хэши и перечисляемые структуры в общем. Мы установили определенное сходство между массивами и хэшами, объясняемое тем, что в оба класса подмешан модуль
EnumerableМы изучили различные методы обхода структур, например
each_sliceeach_consВ главе 9 мы продолжим изучение высокоуровневых структур данных. Не все они входят в ядро Ruby или в стандартные библиотеки. Речь пойдет о множествах, стеках, очередях, деревьях и графах.
Глава 9. Более сложные структуры данных
Графическое представление данных абстрагирует банки памяти любого компьютера. Невообразимая сложность. Лучи света, протянувшиеся в не-пространстве разума, скопления и созвездия данных. Как гаснущие огни большого города.
