Ruby Language
Перечислители
Поиск…
Вступление
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