Suche…


Einführung

Ein Enumerator ist ein Objekt, das die Iteration auf kontrollierte Weise implementiert.

Anstatt die Schleife zu wiederholen, bis eine Bedingung erfüllt ist, listet das Objekt die erforderlichen Werte auf. Die Ausführung der Schleife wird angehalten, bis der nächste Wert vom Eigentümer des Objekts angefordert wird.

Enumeratoren ermöglichen unendliche Werte.

Parameter

Parameter Einzelheiten
yield Reagiert auf yield , die als << als Alias ​​bezeichnet wird. Bei der Ausgabe dieses Objekts wird die Iteration implementiert.

Benutzerdefinierte Enumeratoren

Erstellen wir einen Enumerator für Fibonacci-Zahlen .

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

Wir können jetzt jede beliebige Enumerable Methode mit fibonacci :

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

Bestehende Methoden

Wenn eine Iterationsmethode wie each ohne Block aufgerufen wird, sollte ein Enumerator zurückgegeben werden.

Dies kann mit der Methode enum_for werden:

def each
  return enum_for :each unless block_given?

  yield :x
  yield :y
  yield :z
end

Dies ermöglicht dem Programmierer, Enumerable Operationen zu Enumerable :

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

Zurückspulen

Verwenden Sie rewind , um den Enumerator neu zu starten.

ℕ = 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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow