Как работают счетчики в 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.next
e.next
получить каждый последующий элемент, но как именно он приостанавливает выполнение и затем возобновляет работу в нужном месте?
Я знаю, что если доходность в0.upto
заменяется наFiber.yield
Затем это'Это легко понять, но здесь дело не в этом. Это старый добрыйyield
, Итак, как это работает?
Я посмотрел на enumerator.c, но эторжать на непонятном для меня. Может быть, кто-то мог бы предоставить реализацию в Ruby, используя волокна, а не перечислители на основе продолжения стиля 1.8.6, что бы все прояснило?