0Pricing
Ruby Academy · Урок

Объекты 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.next

StopIteration в конце

Когда значения заканчиваются, 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 — локальная установка не требуется.

Все уроки этого курса

  1. Написание собственного each
  2. Подключение Enumerable
  3. Ленивые перечислители
  4. Объекты Enumerator
← Назад к Ruby Academy