Ricerca…


introduzione

Un Enumerator è un oggetto che implementa l'iterazione in modo controllato.

Anziché eseguire il ciclo fino a quando non viene soddisfatta una condizione, l'oggetto enumera i valori secondo necessità. L'esecuzione del ciclo è sospesa fino a quando il proprietario dell'oggetto non richiede il valore successivo.

Gli enumeratori rendono possibili flussi infiniti di valori.

Parametri

Parametro Dettagli
yield Risponde alla yield , che è alias come << . Cedendo a questo oggetto si implementa l'iterazione.

Enumeratori personalizzati

Creiamo un Enumerator per i numeri di Fibonacci .

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

Ora possiamo usare qualsiasi metodo Enumerable con fibonacci :

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

Metodi esistenti

Se un metodo di iterazione come each viene chiamato senza un blocco, è necessario restituire un Enumerator .

Questo può essere fatto usando il metodo enum_for :

def each
  return enum_for :each unless block_given?

  yield :x
  yield :y
  yield :z
end

Ciò consente al programmatore di comporre operazioni Enumerable :

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

riavvolgimento

Utilizzare il rewind per riavviare l'enumeratore.

ℕ = 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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow