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」と等価ということ?