Wie iteriert Rubys Enumerator-Objekt extern über einen internen Iterator?

Gemäß Rubys Dokumentation verwendet das Enumerator-Objekt daseach method (aufzuzählen), wenn keine Zielmethode für die bereitgestellt wirdto_enum oderenum_for Methoden. Nehmen wir als Beispiel den folgenden Affen-Patch und seinen Enumerator

o = Object.new
def o.each
    yield 1
    yield 2
    yield 3
end
e = o.to_enum

loop do
  puts e.next
end

Vorausgesetzt, das Enumerator-Objekt verwendet dieeach Methode, um zu antworten, wannnext heißt, wie ruft der an?each Methode aussehen, jedes Malnext wird genannt? Lädt die Enumeartor-Klasse den gesamten Inhalt von vor?o.each und erstellt eine lokale Kopie zur Aufzählung? Oder gibt es eine Art Ruby-Magie, die die Operationen bei jeder Ertragsaussage bis aufhängtnext heißt auf dem enumeartor?

Wenn eine interne Kopie erstellt wird, handelt es sich um eine tiefe Kopie? Was ist mit E / A-Objekten, die für die externe Aufzählung verwendet werden könnten?

Ich benutze Ruby 1.9.2.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage