From: masaki Date: 2002-07-18T11:53:29+09:00 Subject: [ruby-dev:17706] self in block 正木です。 block 内の変数の問題については、変数の scope のこと以外に、私にとっては 重要な問題がもう一つあります。 今仮に { ・・・ } で block 内の変数の local 性が保証されたとしても class Sequence def initialize(list=[],*parameter) @list=list @para=parameter @lambda=eval "lambda{"+yield+"}" end def [](n) @list[n] || @list[n]=@lambda.call(n,*@para) end end Fact=Sequence.new([1]){"|n| n*self[n-1]"} を class Sequence def initialize(list=[],*parameter,&block) @list=list @para=parameter @lambda=block end end で置き換えるためには Fact=Sequence.new([1]){ n*self[n-1]} の self が Fact を指してくれないと困ります。 そこで提案ですが、 block が object.method(){ ...} の形のとき、その中での self は、その method を呼んだ object を 指す。 というのは如何でしょうか。 上記の例では、この block が渡される initialize を呼んでいるのは Fact であると解釈して(self=Sequence ではなく) self=Fact ですが無理ですか? 上記の仕様が採用されれば Proc.new{ (n==0)? 1: n*self[n-1]}[5] => 120 といったこともできて便利だと思いますが。