From: matz@... (Yukihiro Matsumoto) Date: 2003-11-01T22:15:22+09:00 Subject: [ruby-dev:21807] Re: ruby-1.8.1-preview2 での rb_iter_break まつもと ゆきひろです In message "[ruby-dev:21802] Re: ruby-1.8.1-preview2 での rb_iter_break" on 03/11/01, Kenta MURATA writes: |この方法では問題がありました.例えば | || static VALUE || ahi_ahi(VALUE obj) || { || rb_catch("ahi", rb_yield, INT2FIX(2)); || } | |のように変更してやってみると,Ahi#ahi の後置ブロックには |Fixnum の 2 が引数として渡されると期待できますが,実際には | | [muraken@feynman ahi]$ ruby -rahi -e "a = Ahi.new; a.ahi{|*args| p args}" | [:ahi] | |こうなってしまいます. | |これは,Ahi#ahi の後置ブロックが rb_f_catch で呼ばれている |rb_yield_0 で捕まってしまったのではないかと想像しているのです |が,解決方法がまだ分かりません.何か良い方法はありますでしょう |か? | |# 僕の想像が間違ってるのかもしれませんが... rb_catch()を使う機会は滅多にないのでまちがえちゃいました。 こんな感じで期待通りだと思います。 #include static VALUE ahi_yield(VALUE a, VALUE b) { return rb_yield(b); } static VALUE ahi_ahi(VALUE obj) { return rb_catch("ahi", ahi_yield, INT2FIX(2)); } static VALUE ahi_abort(VALUE obj) { return 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); }