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.