Ruby Language
enumeratori
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