なひです.まだ混乱してたらしいです...

> 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,ですね.^^;
失礼しました.