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