Как объект Enumerator в Ruby выполняет внешнюю итерацию по внутреннему итератору?
Согласно документации 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
называется на enumeartor?
Если внутренняя копия сделана, это глубокая копия? А как насчет объектов ввода / вывода, которые можно использовать для внешнего перечисления?
Я использую Ruby 1.9.2.