Ruby Language
tellers
Zoeken…
Invoering
Een Enumerator
is een object dat iteratie op een gecontroleerde manier implementeert.
In plaats van te herhalen totdat aan een bepaalde voorwaarde is voldaan, somt het object waar nodig waarden op. De uitvoering van de lus wordt onderbroken totdat de volgende waarde wordt aangevraagd door de eigenaar van het object.
Tellers maken oneindige waardenstromen mogelijk.
parameters
Parameter | Details |
---|---|
yield | Reageert op yield , waarvan de alias wordt gebruikt als << . Opbrengst aan dit object implementeert iteratie. |
Aangepaste opsommers
Laten we een Enumerator
voor Fibonacci-nummers .
fibonacci = Enumerator.new do |yielder|
a = b = 1
loop do
yielder << a
a, b = b, a + b
end
end
We kunnen nu elke Enumerable
methode met fibonacci
:
fibonacci.take 10
# => [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
Bestaande methoden
Als een iteratiemethode zoals each
zonder een blok wordt aangeroepen, moet een Enumerator
worden geretourneerd.
Dit kan worden gedaan met behulp van de methode enum_for
:
def each
return enum_for :each unless block_given?
yield :x
yield :y
yield :z
end
Hiermee kan de programmeur Enumerable
bewerkingen samenstellen:
each.drop(2).map(&:upcase).first
# => :Z
Rewinding
Gebruik rewind
om de teller opnieuw te starten.
ℕ = Enumerator.new do |yielder|
x = 0
loop do
yielder << x
x += 1
end
end
ℕ.next
# => 0
ℕ.next
# => 1
ℕ.next
# => 2
ℕ.rewind
ℕ.next
# => 0