Поиск…


Вступление

Enumerator - это объект, который управляет итерацией контролируемым образом.

Вместо цикла, пока не будет выполнено какое-либо условие, объект перечисляет значения по мере необходимости. Выполнение цикла приостанавливается до тех пор, пока владелец объекта не попросит следующее значение.

Перечислители делают бесконечные потоки значений возможными.

параметры

параметр подробности
yield Отвечает на yield , который псевдоним как << . Уступка этому объекту реализует итерацию.

Пользовательские счетчики

Давайте создадим Enumerator для чисел Фибоначчи .

fibonacci = Enumerator.new do |yielder|
  a = b = 1
  loop do
    yielder << a
    a, b = b, a + b
  end
end

Теперь мы можем использовать любой метод Enumerable с помощью fibonacci :

fibonacci.take 10
# => [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

Существующие методы

Если метод итерации, такой как each вызывается без блока, должен быть возвращен Enumerator .

Это можно сделать с enum_for метода enum_for :

def each
  return enum_for :each unless block_given?

  yield :x
  yield :y
  yield :z
end

Это позволяет программисту создавать операции Enumerable :

each.drop(2).map(&:upcase).first
# => :Z

перематывать

Используйте rewind для перезапуска счетчика.

ℕ = Enumerator.new do |yielder|
  x = 0
  loop do
    yielder << x
    x += 1
  end
end

ℕ.next
# => 0

ℕ.next
# => 1

ℕ.next
# => 2

ℕ.rewind

ℕ.next
# => 0


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow