前田です。

At Wed, 24 Jul 2002 11:30:57 +0900,
Tanaka Akira <akr / m17n.org> wrote:
> >     obj.each{|i|
> >       if condition
> >         found = i
> >       end
> >     }
> >     ...
> >     # foundのアクセスがエラーになる
> > 
> > こんな感じです。
> 
> ふむ。たしかに後からループの上に found = nil というような代入を書くこ
> とはあります。具体的な個々の状況は思い出せないのですが、そんな覚えは確
> かにあるので、そういうケースは確かに私にも何回もあったのでしょう。
> 
> ただ、実行してエラーになった記憶はありません。単に忘れているのか、ある
> いは found = i と書いた瞬間に found = nil が必要であることに気がついて
> しまうのかはよくわかりません。
> 
> でも、いずれにせよ、この仕様を不満に思った覚えはありません。これはたぶ
> ん私が found = nil を宣言とはとらえていないからです。可能性としては
> condition が一回も真にならなかったり、極端な話ブロック自身が一回も
> yield されない場合はありうるわけで、私は found = nil をそのような境界
> 条件に関する処理だと認識している気がします。そして、私は境界条件につい
> て自然に思いをめぐらす質なので、それは苦になりません。

ループの場合はそうかもしれませんが、上の話はかならずしもループに
限定されないのですよね。
たとえば、

open(filename) do |f|
  text = f.read
end
print text

みたいなケースでは、

text = nil
open(filename) do |f|
  text = f.read
end
print text

と書かないといけないのはちょっといやだなあと思うわけです。

-- 
前田 修吾