¿Cómo el objeto Enumerador de Ruby itera externamente sobre un iterador interno?

Según la documentación de Ruby, el objeto Enumerador usa eleach método (para enumerar) si no se proporciona ningún método de destino alto_enum oenum_for metodos Ahora, tomemos el siguiente parche de mono y su enumerador, como ejemplo

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

loop do
  puts e.next
end

Dado que el objeto Enumerador usa eleach método para responder cuandonext se llama, ¿cómo hacen las llamadas a laeach El método parece, cada vez.next ¿se llama? ¿La clase Enumeartor carga previamente todos los contenidos deo.each y crea una copia local para la enumeración? ¿O hay algún tipo de magia Ruby que cuelga las operaciones en cada declaración de rendimiento hasta quenext se llama en el enumerador?

Si se hace una copia interna, ¿es una copia profunda? ¿Qué pasa con los objetos de E / S que podrían utilizarse para la enumeración externa?

Estoy usando Ruby 1.9.2.

Respuestas a la pregunta(1)

Su respuesta a la pregunta