[#20227] dyna_vars problem? — Tanaka Akira <akr@...17n.org>

しばらく前から、稀に Ruby が core を吐くという問題を追いかけているので

15 messages 2003/05/19
[#20234] Re: dyna_vars problem? — matz@... (Yukihiro Matsumoto) 2003/05/19

まつもと ゆきひろです

[#20236] Re: dyna_vars problem? — Tanaka Akira <akr@...17n.org> 2003/05/19

In article <1053363181.529491.30320.nullmailer@picachu.netlab.jp>,

[ruby-dev:20179] Re: (1.8.0-preview2) Proc#call

From: m_seki@...
Date: 2003-05-07 22:35:13 UTC
List: ruby-dev #20179
咳といいます。


> > |ちなみに引数付きの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




In This Thread