Fiberさわってみた

http://www.espace.com.eg/neverblockはFiberをつかって実装されているらしく、Fiberってなんだろう?ということでちょっとさわってみました。

Ruby1.8でもhttp://www.espace.com.eg/neverblock使えるようになったらしいけど、まあいいや。

以下、http://www.espace.com.eg/neverblock/blog/2008/08/19/an-introduction-to-fibers/を参考に。

irb(main):001:0> RUBY_DESCRIPTION
=> "ruby 1.9.0 (2008-08-26 revision 18849) [i686-linux]"
irb(main):002:0> f = Fiber.new do
irb(main):003:1*   3.times do |i|
irb(main):004:2*     Fiber.yield i
irb(main):005:2>   end
irb(main):006:1> end
=> #<Fiber:0x82ae09c>
irb(main):007:0> f.resume
=> 0
irb(main):008:0> f.resume
=> 1
irb(main):009:0> f.resume
=> 2
irb(main):010:0> f.resume
=> 3
irb(main):011:0> f.resume
FiberError: dead fiber called

あれ?、5回目のresumeでFiberErrorだ。
参考にしたhttp://www.espace.com.eg/neverblock/blog/2008/08/19/an-introduction-to-fibers/では、4回目だったのに。
この件、コメント欄に指摘してあった。4回目のresumeが返す3は、x.timesのx。つまりここでは、3.timesだから3ということだが、

irb(main):049:0> 3.times {|i| i}
=> 3

つまりは、4回目のresumeでは、Fiber.yieldを行わないが、ブロックの戻り値を、親ファイバにかえしている。という理解でいいのだろうか?