From: m_seki@... Date: 2003-05-08T07:35:13+09:00 Subject: [ruby-dev:20179] Re: (1.8.0-preview2) Proc#call 咳といいます。 > > |ちなみに引数付きのbreakはどのように振舞うのですか? > > > > Proc#yieldは、breakに対して > > > > if blockがorphan: > > 例外LocalJumpErrorを発生。breakの引数は > > LocalJumpError#exitstatusメソッドで取得できる。 > > # でも今思えばこの名前はまずいな。exitvalueとかかな。 > > else: > > (yieldメソッドではなく)ブロックが付随しているメソッド呼 > > び出しを中断する > > > > となっています。 > > ためしてみました。 > > よく考えたら、ちょっと前の1.8から期待した状況で例外が発生していた気がします。 > だめだと思ってた引数付きのbreakも、現在の1.8でうまく動くようにできました。 Proc#yieldのパラメータも確認しました。 結果: うまくいってます。 パラメータを *x でうけて *x で渡すことで普通のyieldと同じように 動作しました。 # こんな感じ obj.__send__(msg_id, *argv) do |*x| block.yield(*x) end LocalJumpErrorの理由(break, retryなど)を知るには、LocalJumpErrorの messageを元に調べています。 もっと安心できる方法はあるでしょうか? たとえば、問い合わせるメソッドがあるとか、原因別に発生する例外の クラスが異なるとか…。 def foo(local_jump_error) case local_jump_error).message when /^retry/ return :retry when /^break/ return :break, local_jump_error.exitstatus else return :other end end