けいじゅ@SHLジャパンです. In [ruby-list :00662 ] the message: "[ruby-list:662] Re: help for lambda ", on Sep/30 15:33(JST) matz / caelum.co.jp (Yukihiro Matsumoto) writes: >|あともうすこしですから(今日で終り?) がんばってね. >少なくとも今週は続きそうです. そうですか... といいつつメイルを出してしまう(^^;; >|そしたら, とんでもない? バグを発見しました!! これをバグというには可哀 >|想ですが SEGV で落ちるので... >いやあ,バグですね.修正しました. 忙しい割りに素早いですね(^^;; # メイルのリプライに若干ディレイがあるので, 忙しいことは感じますが # (^^;;; >イテレータブロックとlambdaでの動きの違いですが,以下のルール >になっています. > > * イテレータブロックがまだスタック上に残っている時(イテレー > タの終了前)にはイテレータと同じ > * それ以外の場合には,retry,returnは使えない(戻り先が無い > ので). > >そんなに難しくないでしょ. なるほど, 結構動的だったんですね. 普通(常識的)に考えればよいと... さっき, breakの動きが変だといっていたのは, breakを再定義していたせいで した. 良く分析してみると, 以下のような状況になっています. def baz print "baz\n" end class Foo def baz print "Foo#baz\n" end def foo yield end def bar if iterator? p = proc else p = proc{baz} end p.call end end f = Foo.new f.foo{ baz } f.bar f.bar{baz} --- Foo#baz Foo#baz baz この実行結果は正しいのですかねえ?? 特に1番めの結果が気になるのですが??? 1番めは, そのイテレータブロックの定義されている静的スコープで有効なも のになるはずですから, 結果は``baz''になるはずだと思うのですが? ちなみに, 0.99-96/07/22では baz Foo#baz baz となります. __ ..........................................石塚 圭樹@SHLジャパン(株)... ------------->アドレス変わりました!! e-mail: keiju / shljapan.co.jp <----