Fiberその2
次いってみる。resumeの引数が、Fiberブロックのブロックパラメタに渡る
irb(main):056:0> f = Fiber.new do |x| irb(main):057:1* Fiber.yield x irb(main):058:1> end => #<Fiber:0x82799f0> irb(main):059:0> f.resume(1) => 1 irb(main):060:0> f.resume(2) => 2 irb(main):061:0> f.resume(2) FiberError: dead fiber called
次は、
irb(main):062:0> f = Fiber.new do |x| irb(main):063:1* 3.times do |i| irb(main):064:2* Fiber.yield x irb(main):065:2> end irb(main):066:1> end => #<Fiber:0x8216670> irb(main):067:0> f.resume(8) => 8 irb(main):068:0> f.resume(7) => 8 irb(main):069:0> f.resume(6) => 8 irb(main):070:0> f.resume(5) => 3 irb(main):071:0> f.resume(4) FiberError: dead fiber called
Fiberのブロックパラメタxには最初に渡した引数が保持されたまま。でも、4回目のresumeでは、3.timesブロックの戻り値が帰ってくる。1番目の例と同じですね。
次、
irb(main):111:0> f = Fiber.new do |x| irb(main):112:1* 3.times do |i| irb(main):113:2* x = Fiber.yield x irb(main):114:2> puts "x after yield -> #{x}" irb(main):115:2> end irb(main):116:1> end => #<Fiber:0x829e7f0> irb(main):117:0> f.resume(8) => 8 irb(main):118:0> f.resume(7) x after yield -> 7 => 7 irb(main):119:0> f.resume(6) x after yield -> 6 => 6 irb(main):120:0> f.resume(5) x after yield -> 5 => 3 irb(main):121:0> f.resume(4) FiberError: dead fiber called
yieldして親ファイバに制御が移ったのち、resumeで子ファイバに移ると、resumeの引数がxに代入される?resumeの引数が「Fiber.yeild x」と等価ということ?