Como o objeto Enumerador do Ruby itera externamente em um iterador interno?

Conforme a documentação do Ruby, o objeto Enumerator usa oeach método (para enumerar) se nenhum método de destino for fornecido aoto_enum ouenum_for métodos. Agora, vamos pegar o seguinte patch de macaco e seu enumerador, como exemplo

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 o objeto Enumerator usa oeach método para responder quandonext é chamado, como as chamadas para oeach método parece, toda veznext é chamado? A classe Enumeartor pré-carrega todo o conteúdo deo.each e cria uma cópia local para enumeração? Ou existe algum tipo de mágica Ruby que paira as operações em cada declaração de rendimento até quenext é chamado no enumeartor?

Se uma cópia interna é feita, é uma cópia profunda? E quanto aos objetos de E / S que podem ser usados ​​para enumeração externa?

Estou usando o Ruby 1.9.2.

questionAnswers(1)

yourAnswerToTheQuestion