ちょっと必要に駆られて、 Wormhole というライブラリを書きました。

インストールはGitHubから行えます。

1 sudo gem sources -a http://gem s.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 hrow を呼び出して、 外側から Wormhole.c atch で受け止めます。 catch が完了したら、 Wormhole オブジェクトが返るので、 return で中断箇所に戻ります。 Wormhole.t hrow はHashを受け渡すことができます（省略可能）。 また、 catch ブロックと return は上記の例のように続けて記述します。 catch の戻り値を適当な変数に代入して、後で return を呼び出すことも可能ですが、その場合、 catch を抜けた直後から return を呼ぶまでの区間が二度実行されてしまいます （この辺が最初に例外を使って実装してた理由ですね）

中断箇所から処理を再開するために callcc を使っています。 callcc は面白いですね。

更新履歴