Как работают счетчики в Ruby 1.9.1?

Этот вопрос не о том, как использовать перечислители в Ruby 1.9.1, а о том, как они работают. Вот некоторый код:

class Bunk
  def initialize
    @h = [*1..100]
  end

  def each
    if !block_given?
      enum_for(:each)
    else
      0.upto(@h.length) { |i|
        yield @h[i]
      }
    end
  end
end

В приведенном выше коде я могу использоватьe = Bunk.new.each, а потом ,e.nexte.next получить каждый последующий элемент, но как именно он приостанавливает выполнение и затем возобновляет работу в нужном месте?

Я знаю, что если доходность в0.upto заменяется наFiber.yield Затем это'Это легко понять, но здесь дело не в этом. Это старый добрыйyield, Итак, как это работает?

Я посмотрел на enumerator.c, но эторжать на непонятном для меня. Может быть, кто-то мог бы предоставить реализацию в Ruby, используя волокна, а не перечислители на основе продолжения стиля 1.8.6, что бы все прояснило?

Ответы на вопрос(4)

Ваш ответ на вопрос