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 altyield
Wie 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?