[ruby-list:664] Re: help for lambda
From:
Date:
1996-09-30 07:39:56 UTC
List:
ruby-list #664
けいじゅ@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 <----