Ruby1.9から軽量スレッドFiberが追加されました。
generatorを作ってみましょう。
Fiber
Fiberはこんな感じです。
angel = Fiber.new do |msg|
puts "プロ生ちゃんマジ天使!"
Fiber.yield
puts "プロ生ちゃんマジ天使!"
end
angel.resume #=> "プロ生ちゃんマジ天使!"
angel.resume #=> "プロ生ちゃんマジ天使!"
これだと puts "プロ生ちゃんマジ天使!"
を何度も書かないといけないので面倒くさいです。
angel = Fiber.new do |msg|
loop do
puts Fiber.yield
end
end
10.times { angel.resume "プロ生ちゃんマジ天使!" } #=>
"プロ生ちゃんマジ天使!"
"プロ生ちゃんマジ天使!"
"プロ生ちゃんマジ天使!"
"プロ生ちゃんマジ天使!"
"プロ生ちゃんマジ天使!"
"プロ生ちゃんマジ天使!"
"プロ生ちゃんマジ天使!"
"プロ生ちゃんマジ天使!"
"プロ生ちゃんマジ天使!"
Enumerator
Enumeratorでも同じことをやってみましょう。
外部イテレータとしての機能はFiberで実装されています。
angel = Enumerator.new do |msg|
loop do
msg << "プロ生ちゃんマジ天使!"
end
end
angel.take(10).join(' ') #=>
"プロ生ちゃんマジ天使! プロ生ちゃんマジ天使! プロ生ちゃんマジ天使! プロ生ちゃんマジ天使! プロ生ちゃんマジ天使! プロ生ちゃんマジ天使! プロ生ちゃんマジ天使! プロ生ちゃんマジ天使! プロ生ちゃんマジ天使! プロ生ちゃんマジ天使!"
まとめ
FiberとEnumeratorを使ってgeneratorを作ってみました。
無限リストなどを処理するときは、Enumerator::Lazyをどうぞ。