まつもと ゆきひろです

In message "[ruby-list:13951] Message of Today in 1999/04/20."
    on 99/04/20, "NAKAMURA, Hiroshi" <nakahiro / sarion.co.jp> writes:

|  ローカル変数がネストしない信念とは
|
|  ひとつのメソッド内で同じ名前の変数が別の意味を持たない
|
|  ことです.
|  分かりやすさのためですね
|  でも,ブロック内初出のメソッドは別の意味を用いるのが不徹底.;_; 
|
|とあります.

久野さんがbitでなされたCLUでの説明があると分かりやすそうです
が.前田さん,コピー持ってたっけ?

# 私も自宅の何処かにあったような.

|1. 「ひとつのメソッド内」は「ひとつのブロック内」でよいのでしょうか.

ひとつの「スコープ」の方が良いかしら.Rubyではブロックってい
うと,「イテレータ」につけるアレのことを意味しますから,「ひ
とつのブロック内」だとちょっと意味が変わって来ます.

|2. 逆を取って「変数の名前を見ただけでその意味が決められる」
|   (=分かりやすい)という理解でよいのでしょうか.

ま,そういうことですね.この名前の変数はひとつのスコープ(典
型的にはメソッド)内にひとつとしたい訳です.気分としては.

|3. ブロック内初出のメソッド(名?)が持つ別の意味とは何でしょう.
|   それを見ただけではローカル変数と区別できない,
|   ということと関係ありますか?

これは以下の例で分かりますか?

   def foo
     var1 = nil
     loop do
       var2 = 5
       ...
     end
     defined? var1      #=> true
     defined? var2      #=> false
     loop do
       var2 = 20
       ...
     end
   end

つまり,ブロックの内部で初出のローカル変数の有効範囲(スコー
プ)はそのブロックの終りまでです.これは「スコープはネストし
ない」というルールの例外になっています.結果としてひとつのス
コープ内でひとつの変数(この場合にはvar2)に複数の意味を割り振
ることができます.

                                まつもと ゆきひろ /:|)