坂野 正明です。

At Wed, 6 Aug 2003 20:37:26 +0900,
SAITO Shukaku wrote:
> At Wed, 6 Aug 2003 20:12:38 +0900,
> hirocy wrote:
> > 
> > この foreach のスコープでしか使われない id が
> > ずっと生きてしまうのが気持ち悪いんです.再利用もしたい.
> > たとえ,nilを入れたとしても,スコープが生きてしまいます.
> 
> 変数(変数名?)が残ると"気持ち悪い"ですか。ふーむ、思いもしませんでした。
> 使いもしないオブジェクト(実体)を保持し続けるのは嫌なので、変数にnilを代
> 入することがありますが、その変数もなかったことにしようと考えたことはあり
> ませんでした。

"気持ち悪い"というお気持ち、分かります。

次に同変数名を使う時、未定義状態のローカル変数として扱いたい、という
意味ですよね? そうすると、バグの未然の防止にもなりそうですね。

もりきゅう氏のおっしゃる"メソッド定義"の方が、王道のような気もしますが、
この場合なら、該当部分をイテレータで囲ってやってもいいですね (大仰?)。
たとえば、こんな(↓)感じでしょうか (もっとスマートに書けるかも…)。


#-------------
a = []
loop{
idx = nil
IO.foreach(x) do |line|
        if /^# ID:(.)/ =~ line
                idx = $1
        else
                a << idx + line.chomp
        end
end
break
}

p idx	# => NameError
#-------------

## オリジナルに比べて、該当変数名を idx に変更しています。


坂野 正明