From: Yusuke ENDOH Date: 2008-07-06T16:45:15+09:00 Subject: [ruby-dev:35380] Re: fiber もどき for 1.8.x 遠藤です。 2008/07/05 14:09 IWAMURO Motonori : > 1.9.0-2見るまで知らなかったのですが、Generator消えるんですね。 > > まだ1.8ユーザですが、単に消えられるとちょっと困るので、callcc を使って1.8にFiberもどき(もがき)を書いてみたのですが、如何でしょう? 逆に、Fiber を使って 1.9 用に generator.rb を書いてみました。 即興で書いたので真面目に検証してないですが、1.8 の generator.rb に 付属していたテストはパスしました。 class Generator include Enumerable def initialize(enum = nil, &block) @block = enum ? proc {|g| enum.each {|x| g.yield(x) } } : block @fiber = Fiber.new { @block.call(self); @fiber = nil } @index = 0 @queue = [] @fiber.resume end def yield(value) @queue << value Fiber.yield(value) end def end? @fiber.nil? && @queue.empty? end def next? !end? end def index @index end alias pos index def next raise(EOFError, "no more elements available") if end? @fiber.resume @index += 1 @queue.shift end def current raise(EOFError, "no more elements available") if @queue.empty? @queue.first end def rewind initialize(nil, &@block) if @index.nonzero? self end def each rewind yield self.next until end? self end end -- Yusuke ENDOH