From: m_seki@... Date: 2002-10-04T12:44:53+09:00 Subject: [ruby-dev:18456] Re: break from proc-closure 咳です。 > |ruby 1.6.7のCVS版の方で dRuby のUnitTestが通らなくなりました。 > |いつころからかはっきり分からないですが、ruby 1.6.7 (2002-03-19)はOKで > |(2002-06-04)では失敗します。 > > 試してみたのですが、これはどこがどういう風に変わったのか自分 > でもよくわかりませんでした(ダメすぎ)。 > > 1.6.7とCVS版で動作が違うスクリプトがいただけませんか? すみません。まだdRuby抜きで発生させるスクリプトが書けてません。 とりあえず、drb-1.3.8を使って動作が異なるスクリプトを載せます。 * ruby-1.6.7 (2002-03-01) OK * ruby-1.6.7 (2002-04-04) OK * ruby-1.6.7 (2002-05-20) NG * ruby-1.6.8 (2002-10-03) NG でした。 == OK * 端末1 % ruby -v ruby 1.6.7 (2002-03-01) [i686-linux] % ruby a.rb druby://localhost:12345 * 端末2 % ruby b.rb 1 2 3 4 % ruby b.rb 1 1 2 3 4 == NG * 端末1 % ruby -v ruby 1.6.8 (2002-10-03) [i686-linux] % ruby a.rb druby://localhost:12345 * 端末2 % ruby b.rb 1 2 3 4 % ruby b.rb 1 1 2 3 4 (druby://juke:1575) b.rb:12:in `obj_send': undefined method `[]' for nil (NameError) from (druby://juke:1575) /usr/local/lib/ruby/site_ruby/1.6/drb/drb.rb:517:in `proc .... # a.rb require 'drb/drb' DRb.start_service('druby://localhost:12345', 1..8) puts DRb.uri gets # b.rb require 'drb/drb' # 失敗するバージョンにする再定義 module DRb class DRbServer def obj_send(obj, msg_id, *argv) if Proc === obj && msg_id == :yield_call if argv.size == 1 ary = argv else ary = [argv] end ary.collect(&obj)[0] # it = ary.collect(&obj) # raise(LocalJumpError, 'break from proc-closure') if it.nil? # it[0] else obj.__send__(msg_id, *argv) end end end end def test(uri) ary = DRbObject.new(nil, uri) ary.each do |x| puts x break if x == 4 end end uri = 'druby://localhost:12345' DRb.start_service if ARGV.shift test(uri) else ary = DRbObject.new(nil, uri) ary.each do |x| puts x break if x == 4 end end > |ですが、LocalJumpErrorはどういうときに発生するでしょうか ? > > 現在では ... > * yieldしてblock->tagがないとき(※) ... > ※ なんでこうなってるかよくわかりません。eval.c難しい ^^;;; ^^;