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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow