From: Tietew Date: 2003-09-30T20:27:21+09:00 Subject: [ruby-dev:21448] Re: break from block yielded in until On Tue, 30 Sep 2003 19:06:23 +0900 In article <200309301006.h8UA61ri020702@sharui.nakada.kanuma.tochigi.jp> [[ruby-dev:21445] Re: break from block yielded in until] nobu.nakada@nifty.ne.jp wrote: > rb_catch()からrb_iterate(), catch_i(), rb_f_catch(), > rb_yield_0(), rb_yield()と呼び出されますが、ruby_scopeがずっと > 共通になっているためrb_iterate()のPROT_ITERで止まってしまうよう > です。 ありがとうございます。このパッチで直るようです。 > うーん、rb_iterate()でPUSH_SCOPE()してしまっていいんだろうか。 > rb_catch()でしたほうがいいような気がしなくもない。 rb_iterate を直で使ったときも同じように break が途中で止まってし まったので,これでいいとおもいます。パッチ当てると "1" だけ出力 して止まります。 tietew@ww2:~/test/iter$ ruby1.8 -riter -e 'itertest { |i| p i; break }' 1 2 3 4 tietew@ww2:~/test/iter$ ruby1.8 -e ' > def itertest > test(1) { |p| yield p } > test(2) { |p| yield p } > test(3) { |p| yield p } > test(4) { |p| yield p } > end > def test(num) > yield num > end > itertest { |i| p i; break } > ' 1 ---^ iter.c #include "ruby.h" static VALUE itertest_iter() { return rb_yield(Qnil); } static VALUE iter_main() { return rb_funcall(Qnil, rb_intern("itertest_iter"), 0); } static VALUE iter_test(VALUE arg, VALUE num) { return rb_yield(num); } static VALUE itertest() { rb_iterate(iter_main, Qnil, iter_test, INT2FIX(1)); rb_iterate(iter_main, Qnil, iter_test, INT2FIX(2)); rb_iterate(iter_main, Qnil, iter_test, INT2FIX(3)); rb_iterate(iter_main, Qnil, iter_test, INT2FIX(4)); return Qnil; } void Init_iter() { rb_define_global_function("itertest_iter", itertest_iter, 0); rb_define_global_function("itertest", itertest, 0); } —[ Tietew ]—————————————————————————— メ : tietew@tietew.net / tietew@raug.net / tietew@masuclub.net ホペ: http://www.tietew.net/ Tietew Windows Lab. http://www.masuclub.net/ 鱒倶楽部 指紋: 26CB 71BB B595 09C4 0153 81C4 773C 963A D51B 8CAA