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を行わないが、ブロックの戻り値を、親ファイバにかえしている。という理解でいいのだろうか?