ちょっと必要に駆られて、 Wormhole というライブラリを書きました。
インストールはGitHubから行えます。
1 sudo gem sources -a http://gems.github.c om 2 sudo gem install genki-worm hole
メソッドの内部を実行中に、呼び出し元に一旦処理を戻し、 中断した場所から処理を継続する機能を提供します。
例えば、以下のようなプログラムに対して、
1 require 'rubygems' 2 require 'wormhole' 3 4 def foo 5 puts "foo" 6 Wormhole.throw :foo => 'hello' do |data| 7 puts data[:foo] 8 end 9 puts "bar" 10 end 11 12 Wormhole.catch do 13 foo 14 end.return do |data| 15 puts data[:foo] 16 data[:foo] = 'world!' 17 end
結果として、以下のような出力を得ます。
1 foo 2 hello 3 world! 4 bar
処理を中断したいところで Wormhole.t
を呼び出して、
外側から Wormhole.c
で受け止めます。
catch
が完了したら、Wormhole
オブジェクトが返るので、
return
で中断箇所に戻ります。
Wormhole.t
はHashを受け渡すことができます(省略可能)。
また、catch
ブロックとreturn
は上記の例のように続けて記述します。
catch
の戻り値を適当な変数に代入して、後でreturn
を呼び出すことも可能ですが、その場合、catch
を抜けた直後から
return
を呼ぶまでの区間が二度実行されてしまいます
(この辺が最初に例外を使って実装してた理由ですね)
中断箇所から処理を再開するために callcc
を使っています。
callcc
は面白いですね。
更新履歴
- 2008/7/4 例外処理をやめてthrow/catc
hを使うようにしました。それにあわせて本文を修正しました。