正木です。

From: "Shin'ya Adzumi" <adzumi / denpa.org>
Subject: [ruby-dev:17713] Re: self in block
Date: Thu, 18 Jul 2002 23:39:31 +0900
> これだと Foo のインスタンスメソッドをブロック内から呼ぶ場合に a を指定
> しないといけなくなりませんか? private なメソッドの場合、呼び出し不可能
> になるんじゃないかなと思います。
> 

すみません。この回避策は撤回します。
この case では従来の block を使えば良いと思います。

この case のように block が呼ばれる場所の context が分かっている時は、
従来の block の仕様で特に問題はなく、便利なことも多いと思っています。
(中途半端な block 内 local 変数の仕様はなくしたほうが良いとは思いますが)

問題は initialize に渡される block のように、いつどこで呼ばれるかあらかじめ
分からない場合で、従来の仕様だと self も不定(大抵は main ですが)で使いようが
無いし、変数の scope も問題があります。

私の(妥協案でない)本音の提案は以下の通りです:

従来の仕様から block 内 local 変数をはずす。
(これは仕様がすっきりするというだけの理由です。)

逆に新しい仕様ではすべての local 変数を block 内 local 変数にする。正確には:
object.method(){<x,...> ...}
の形のときは local 変数の scope は block 内に限定される。
self はこれを呼び出した object を指す。

以上です。

勿論 Ruby を使う目的は人によって違うわけですから、上記の仕様が、
すべての人にとって最善とは限らないということは承知しています。