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