福間@福岡 です。 記事 <000901bf2f6f$48f9d0b0$0201a8c0 / tinyforest.gr.jp> にて、 "Shigeo Kobayashi" <shigeo / tinyforest.gr.jp> さんは書きました: > 「例外」という言葉を、安易に使ってしまいました。C++でも、障害復旧 > 目的以外に(大域脱出のために)、try/throw/catchをよく使うので、 > その点では同じだと判断しました。ただ、C++ではthrowしないと > catchは実行されないのでちょっと気になった次第です。 Rubyの catch/throw は、C++の try+catch/throw というよりは、むしろCの setjmp()/longjmp() に似ています。 jmp_buf tag; int foo1(void) { longjmp(tag, 25); return -1; } int foo2(void) { return foo1(); } int main(int argc, char *argv[]) { int result; if ((result = setjmp(tag)) == 0) { result = foo2(); /* foo2() → foo1() → longjmp() で setjmp() までジャンプ */ } /* ここから実行を再開、result の値は 25 */ return 0; } > > x = catch(:hoge){ throw(:hoge) unless num > 0; num } > ーん。もし、num>0ならthrowは実行されないので、ブロックの > 最後の値になるということですね。throwしないのに、こぼれた > numの値を「catch」するってことになる...(しつこくてすいません) catchするのは「引数で指定されたタグ(:hoge)」であって、値ではありません。 対応するタグがthrowされなかったら、catchは何もcatchせずに終了します。 --- Yasuhiro Fukuma (福間 康弘) as Yasu.F @ Kitakyushu.Fukuoka.Japan Web site: http://www8.big.or.jp/~yasuf/ PGP fingerprint = 17 25 8A F3 99 E5 7E 19 C0 EA 6E 03 8A C3 CE F0 “I hate AMERIKA-JIN.”