Этот вопрос не о том, как использовать Enumerators в Ruby 1.9.1, но мне интересно, как они работают. Вот код:Как работают Enumerators в 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, основанные на продолжении перечислителей, что делает все ясно?
благодарит за ваш ответ. да, я задаю довольно много подробностей об этом. в частности, я хотел бы знать, можно ли реализовать все это в Ruby или есть что-то скрытое в C, что невозможно в Ruby. Если это возможно реализовать в Ruby, я бы хотел увидеть код! :) – horseyguy