Объекты Enumerator
Внешняя итерация
«Объекты Enumerator» — бесплатный урок Ruby Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Ruby Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Ruby Academy содержит 4 уроков всего.
Внешняя итерация
Перечислитель — это объект, представляющий итерацию. Он поддерживает внешнюю итерацию: Вы получаете значения по одному с помощью next, вместо того чтобы передавать блок в each.
enum = [10, 20, 30].each
puts enum.next
puts enum.nextПолучение перечислителя
Вызовите метод итерации, например each, без блока — и получите перечислитель вместо немедленного выполнения.
enum = [1, 2, 3].each
puts enum.classПолучение следующего элемента
next возвращает следующий элемент при каждом вызове. Перечислитель запоминает свою позицию.
letters = ["a", "b", "c"].each
puts letters.next
puts letters.next
puts letters.nextStopIteration в конце
Когда значения заканчиваются, next вызывает исключение StopIteration. Вы можете перехватить его и корректно остановить итерацию.
enum = [1, 2].each
begin
loop { puts enum.next }
rescue StopIteration
puts "done"
endПросмотр и перемотка
peek просматривает следующее значение, не перемещая позицию, а rewind возвращает её в начало.
enum = [5, 6, 7].each
puts enum.peek
puts enum.next
enum.rewind
puts enum.nextСоздание пользовательских перечислителей
Создайте собственный перечислитель с помощью Enumerator.new. Блок получает объект-передатчик y; передавайте значения с помощью y << или y.yield.
evens = Enumerator.new do |y|
n = 0
loop do
y << n
n += 2
end
end
puts evens.next
puts evens.next
puts evens.nextБесконечные перечислители
Поскольку они работают на основе извлечения, пользовательские перечислители могут быть бесконечными. Вы получаете только необходимые значения.
counter = Enumerator.new do |y|
i = 1
loop { y << i; i += 1 }
end
p counter.first(5)Перечислители поддерживают Enumerable
Перечислитель подключает модуль перечисления, поэтому с ним работают все обычные методы (map, select, take), объединяя внутреннюю и внешнюю итерацию.
fib = Enumerator.new do |y|
a, b = 0, 1
loop do
y << a
a, b = b, a + b
end
end
p fib.take(8)with_index
with_index добавляет индекс к любому перечислителю; при необходимости начальным можно указать пользовательское число.
["x", "y", "z"].each.with_index(1) do |item, i|
puts "#{i}: #{item}"
endВозврат перечислителя из each
В собственных классах возвращайте to_enum(:each) (или enum_for), если блок не передан, чтобы вызывающий код мог выполнять внешнюю итерацию.
class Trio
def each
return to_enum(:each) unless block_given?
yield 1; yield 2; yield 3
end
end
e = Trio.new.each
puts e.next
puts e.nextСоберём всё вместе
Перечислители дают тонкий контроль:
- Получайте значения с помощью
next, просматривайте следующий элемент или перематывайте назад. - Создавайте собственные перечислители с помощью
Enumerator.newи объекта, выдающего значения. - Их можно перебирать, поэтому работают все операции map/select/take.
odds = Enumerator.new do |y|
n = 1
loop { y << n; n += 2 }
end
p odds.first(4)Быстрая проверка
Проверьте, насколько хорошо вы поняли объекты Enumerator.
Итоги
Вы изучили объекты Enumerator:
- Внешний перебор с помощью
next,peek,rewind. StopIterationсообщает о завершении.- Создание собственных перечислителей с помощью
Enumerator.new { |y| ... }. - Их можно перебирать, и они могут быть бесконечными.
nums = Enumerator.new { |y| 1.upto(3) { |n| y << n } }
puts nums.next
puts nums.nextЧасто задаваемые вопросы
Урок «Объекты Enumerator» бесплатный?
Да — полный текст урока «Объекты Enumerator» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Ruby Academy, подпишись на CoddyKit PRO. Курс Ruby Academy содержит 4 уроков всего.
Чему я научусь в уроке «Объекты Enumerator»?
Внешняя итерация Ты практикуешь Ruby Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Ruby Academy?
Предыдущий опыт не требуется. Ruby Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Объекты Enumerator»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Ruby Academy?
Да. Каждый урок Ruby Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Написание собственного each
- Подключение Enumerable
- Ленивые перечислители
- Объекты Enumerator