Wie funktionieren Enumeratoren in Ruby 1.9.1?

Bei dieser Frage geht es nicht um die Verwendung von Enumeratoren in Ruby 1.9.1, sondern um deren Funktionsweise. Hier ist ein Code:

class Bunk
  def initialize
    @h = [*1..100]
  end

  def each
    if !block_given?
      enum_for(:each)
    else
      0.upto(@h.length) { |i|
        yield @h[i]
      }
    end
  end
end

Im obigen Code kann ich verwendene = Bunk.new.each, und danne.next, e.next um jedes nachfolgende Element zu erhalten, aber wie genau wird die Ausführung angehalten und dann an der richtigen Stelle fortgesetzt?

Mir ist bewusst, dass, wenn die Ausbeute in der0.upto wird ersetzt durchFiber.yield dann ist es leicht zu verstehen, aber das ist hier nicht der Fall. Es ist einfach altyieldWie funktioniert es?

Ich habe auf enumerator.c geschaut, aber es ist für mich fast unverständlich. Vielleicht könnte jemand eine Implementierung in Ruby bereitstellen, bei der Fibers und nicht 1.8.6-basierte fortlaufende Enumeratoren verwendet werden, was alles klar macht?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage