From: matz@... (Yukihiro Matsumoto) Date: 2003-11-01T09:57:45+09:00 Subject: [ruby-dev:21800] Re: ruby-1.8.1-preview2 での rb_iter_break まつもと ゆきひろです In message "[ruby-dev:21794] ruby-1.8.1-preview2 での rb_iter_break" on 03/10/31, Kenta MURATA writes: |ruby-1.8.0 では動作していた拡張ライブラリが ruby-1.8.1-preview2 では例 |外を投げるようになってしまいました.簡略化したコードを以下に示します. | static VALUE | ahi_abort(VALUE obj) | { | rb_iter_break(); | } これは仕様変更(というか、今まで偶然動いていた)ものです。 正しくは | #include | | static VALUE | ahi_ahi(VALUE obj) | { | rb_catch("ahi", rb_yield, Qnil); | } | | static VALUE | ahi_abort(VALUE obj) | { | rb_throw("ahi", Qnil); | } | | void | Init_ahi(void) | { | VALUE cAhi = rb_define_class("Ahi", rb_cObject); | rb_define_method(cAhi, "ahi", ahi_ahi, 0); | rb_define_method(cAhi, "abort", ahi_abort, 0); | } としてください。むやみにbreakをつかうのでなく、こういう目的 にはcatch/throwがお薦めです。 まつもと ゆきひろ /:|)