Как объект Ruby Enumerator выполняет внешнюю итерацию по внутреннему итератору?

Согласно документации Ruby, объект Enumerator использует метод each(для перечисления ), если для методов to_enumили enum_forне указан целевой метод. Теперь возьмем в качестве примера следующий патч для обезьян и его перечислитель

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

loop do
  puts e.next
end

Учитывая, что объект Enumerator использует метод eachдля ответа при вызове next, как выглядят вызовы метода eachпри каждом вызове next? Загружает ли класс Enumeartor предварительно -все содержимое o.eachи создает локальную копию для перечисления? Или есть какая-то магия Ruby, которая приостанавливает операции в каждом операторе yield до тех пор, пока в перечислителе не будет вызван next?

Если делается внутренняя копия, является ли она глубокой копией? Как насчет объектов ввода-вывода, которые можно использовать для внешнего перечисления?

Я использую Руби 1.9.2.

7
задан Andrew Marshall 15 June 2012 в 20:55
поделиться