Szukaj…


Wprowadzenie

Moduł Enumerator to obiekt, który implementuje iterację w kontrolowany sposób.

Zamiast zapętlać, dopóki jakiś warunek nie zostanie spełniony, obiekt wylicza wartości w razie potrzeby. Wykonanie pętli zostaje wstrzymane, dopóki właściciel obiektu nie zażąda następnej wartości.

Liczniki umożliwiają nieskończone strumienie wartości.

Parametry

Parametr Detale
yield Odpowiada na yield , która jest aliasowana jako << . Poddanie się temu obiektowi implementuje iterację.

Niestandardowe moduły wyliczające

Enumerator dla liczb Fibonacciego .

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

Możemy teraz użyć dowolnej metody Enumerable z fibonacci :

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

Istniejące metody

Jeśli metoda iteracyjna, taka jak each jest wywoływana bez bloku, należy zwrócić Enumerator .

Można to zrobić za pomocą metody enum_for :

def each
  return enum_for :each unless block_given?

  yield :x
  yield :y
  yield :z
end

Umożliwia to programiście tworzenie operacji Enumerable :

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

Przewijanie

Użyj rewind do rewind aby zrestartować moduł wyliczający.

ℕ = 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow