Sök…


Introduktion

Enumerator är ett objekt som implementerar iteration på ett kontrollerat sätt.

Istället för att slinga tills något villkor är uppfyllt, räknar objektet upp värden efter behov. Utförandet av slingan pausas tills nästa värde begärs av objektets ägare.

Räknare möjliggör oändliga värdeströmmar.

parametrar

Parameter detaljer
yield Svarar på yield , vilket är alias som << . Att ge detta objekt implementerar iteration.

Anpassade uppräknare

Låt oss skapa en Enumerator för Fibonacci-nummer .

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

Vi kan nu använda valfri Enumerable metod med fibonacci :

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

Befintliga metoder

Om en iterationsmetod som each kallas utan block, bör en Enumerator returneras.

Detta kan göras med metoden enum_for :

def each
  return enum_for :each unless block_given?

  yield :x
  yield :y
  yield :z
end

Detta gör det möjligt för programmeraren att komponera en Enumerable operationer:

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

bakåt

Använd rewind att starta om telleren.

ℕ = 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow