myugaruさんのBlogでコルーチン(ファイバーとも呼ばれる)の存在を知る。
コルーチン:http://blogs.wankuma.com/myugaru/archive/2008/03/10/127005.aspx
そしてRubyにはFiberというクラスがあるらしい
情報モト:http://blogs.wankuma.com/myugaru/archive/2008/03/10/127059.aspx
ふむ…このFiberというのは、Ruby1.9からあるみたい。
俺の持ってるRubyは1.8系列…使えないじゃん!!ということで、前回の記事で1.9にアップデートをしました。
ということで準備万端。Fiberを使ってみよう。
Fiberクラスの使い方は簡単で
- コンストラクタにブロックを渡す
- resumeでブロックの処理を呼び出す
- Fiber.yieldで呼び出しもとに戻る
という3機能のみ。とてもシンプルです。
これを使ったいいネタが無いかなぁと思って考えてみたけど思いつかなかったので、myugaruさんの所のC#での例をそのままRubyに移植してみた。
class CoRoutine
# stateAの値を1~3に変更していくFiberを返す
def task_a
Fiber.new do
loop do
(1..3).each do |i|
@stateA = i
Fiber.yield # resume呼び出した所に戻る
end
end
end
end
# stateBの値を1~2に変更していくFiberを返す
def task_b
Fiber.new do
loop do
(1..2).each do |i|
@stateB = i
Fiber.yield # resume呼び出した所に戻る
end
end
end
end
def run
# stateA, stateBを更新するFiberを作って
a = task_a
b = task_b
# 10回aとbを実行して
10.times do
a.resume
b.resume
# 現在のstateの値を出力
puts "A#{@stateA} B#{@stateB}"
end
end
end
# 実行!!
CoRoutine.new.run
実行するとmyugaruさんの作ったC#のサンプルと同じ結果になる。