RubyにおけるFiberクラスの resume と transfer
transfer
code:rb
require 'fiber'
fr1 = Fiber.new do |v|
:fugafuga
end
fr2 = Fiber.new do |v|
fr1.transfer
:fuga
end
fr3 = Fiber.new do |v|
fr2.resume
:hoge
end
p fr3.resume # => :fugafuga
ん??これはリファレンスマニュアルのサンプルコードなんだけど、実行したら :hoge が出力されるな
code:sh
% cat transfer.rb
require 'fiber'
fr1 = Fiber.new do |v|
:fugafuga
end
fr2 = Fiber.new do |v|
fr1.transfer
:fuga
end
fr3 = Fiber.new do |v|
fr2.resume
:hoge
end
p fr3.resume # => :fugafuga
% ruby transfer.rb
:hoge
resume
共通点
自身が表すファイバーへコンテキストを切り替える
自身は resume を呼んだファイバーの子となる
相違点
ファイバーが終了したときや Fiber.yield が呼ばれたとき
resumeはファイバーの親に戻る
transferはメインファイバーに戻る