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


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow