Ruby Language
Énumérateurs
Recherche…
Introduction
Un Enumerator
est un objet qui implémente une itération de manière contrôlée.
Au lieu de boucler jusqu'à ce qu'une condition soit satisfaite, l'objet énumère les valeurs nécessaires. L'exécution de la boucle est suspendue jusqu'à ce que le propriétaire de l'objet demande la valeur suivante.
Les énumérateurs permettent des flux de valeurs infinis.
Paramètres
Paramètre | Détails |
---|---|
yield | Répond au yield , qui est aliasé comme << . Céder à cet objet implémente une itération. |
Enumérateurs personnalisés
Créons un Enumerator
pour les nombres de Fibonacci .
fibonacci = Enumerator.new do |yielder|
a = b = 1
loop do
yielder << a
a, b = b, a + b
end
end
Nous pouvons maintenant utiliser n'importe Enumerable
méthode Enumerable
avec fibonacci
:
fibonacci.take 10
# => [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
Méthodes existantes
Si une méthode d'itération telle que each
est appelée sans bloc, un Enumerator
doit être renvoyé.
Cela peut être fait en utilisant la méthode enum_for
:
def each
return enum_for :each unless block_given?
yield :x
yield :y
yield :z
end
Cela permet au programmeur de composer des opérations Enumerable
:
each.drop(2).map(&:upcase).first
# => :Z
Rembobinage
Utilisez rewind
pour redémarrer l'énumérateur.
ℕ = Enumerator.new do |yielder|
x = 0
loop do
yielder << x
x += 1
end
end
ℕ.next
# => 0
ℕ.next
# => 1
ℕ.next
# => 2
ℕ.rewind
ℕ.next
# => 0