なひです.まだ混乱してたらしいです... > From: NAKAMURA, Hiroshi [mailto:nakahiro / sarion.co.jp] > Sent: Wednesday, April 21, 1999 12:23 PM 「ローカル変数はネストしない」という話題において > ちなみにRubyにおけるスコープは, > > - BEGIN > - トップレベル > - def/class/module〜end > - ブロック こんなこと書きました.これ自体はウソでもないと思うんですが, これらスコープはそれぞれまた異なる特質を持ちますね... まず,「トップレベル」というのは, Kernelクラスのmodule〜endに等しいと考えてよいのでしたっけ? あるいはmainオブジェクトの特異メソッド宣言中? まぁともかく,いずれにせよ,def/class/module〜endスコープの一種. ここで, class Foo foo = 1 def bar p foo # => NG end class Bar p foo # => NG end module Baz p foo # => NG end loop do p foo # => OK break end end Foo.new.bar からもわかるように, ローカル変数は def/class/module〜endスコープについてはネストするが, ブロックスコープについてはネストしない. / / / そして,4/20付「今日のひとこと」の ローカル変数がネストしない信念とは ひとつのメソッド内で同じ名前の変数が別の意味を持たない ことです. というのは, 「一つのdef/class/module〜endスコープ内で 同じ名前の変数が別の意味を持たない」 ということであり, ブロック内初出のメソッドは別の意味を用いるのが不徹底 というのは, 「一つのdef/class/module〜endスコープ内で, 別ブロックに含まれる変数は,異なる意味を持つ」 ということである,と. / / / こんなふうに理解してみました.ウソでないといいんですが.^^; で,なんでわざわざアタリマエに見えるこんなことを, 思い出したように書いてるかというと,なひが以前に書いた > 典型的ではない,class/moduleを考えると, > クラス/モジュールスコープ内で名前からその意味が一意に決まるように > コーディングするのは...うーん,大規模になると大変かも... が,ピント外れだったことに気づいたからです. class/module〜endスコープ内において,確かにブロックスコープは ネストしません.が,class/module〜endスコープの中に出てくるのは, 大抵def〜endスコープであり,こいつはブロックじゃないんですよね. なので,別def〜endスコープに含まれる変数が別の意味でも, Rubyの信念に反しません. というわけで,大規模開発にも安心してRuby,ですね.^^; 失礼しました.