原です。 > * ローカル変数のバインドは静的に行われています. > * ローカル変数は最初の代入文で定義されます. > * 代入という操作で変数が定義される訳ではなく,代入文が現れ > ることによって(実行されなくても)定義される > 定義されているとはプログラム中でjという識別 > 子によってその変数にアクセスできるかどうかをしめすものです. とのこと、良く分かりました。しばらくすると忘れてしまいそうな ので、未整理で冗長ですが、ここで自分のために perl との比較も 入れて書き留めておきます。 << 局所変数について >> 【1】ローカル変数のバインドは静的に行われ、ローカル変数は最初の代 入文で定義される。 この場合、静的とは、実行前にスクリプトのコード上で、という感じの 意味。 例: -----^ test1.rb for i in 0..1 print defined?(j), "\n" j = 1 print defined?(j), "\n" end -----$ test1.rb ==> ------^ FALSE local-variable FALSE local-variable ------$ となる。これは Perl5 の -----^ test1.pl for($i = 0; $i <=1; $i++) { print defined($j), "\n"; local($j) = 1; print defined($j), "\n"; } -----$ test1.pl ==> ------^ 1 1 ------$ で類似の結果が得られるが(Perl4 ではまた違う結果になる。)、その 意味は異なる。ruby では、j がループのブロックでは局所化されない。 例: -----^ test1a.rb j = 2 for i in 0..0 j = 1 end print j, "\n" # ==> 1 -----$ test1a.rb -----^ test1a.pl $j = 2; for($i = 0; $i <= 0; $i++) { local($j) = 1; } print $j, "\n"; # ==> 2 -----$ test1a.pl 【2】イテレータのブロックでは、そこで初めて定義されたローカル変数は 局所化される。 例: -----^ test2.rb [0].each do |i| j = 1 print j, "\n" # ==> 1 end print defined?(j), "\n" # ==> FALSE -----$ test2.rb イテレータではブロック外部のローカル変数(小文字で始まるの変数)にアク セス出来る。 例: -----^ test2a.rb j = 2 [0].each do |i| print j, "\n" # ==> 2 j = 1 end print j, "\n" # ==> 1 -----$ test2a.rb メソッドの定義では外部のローカル変数(小文字で始まるの変数)にアクセス できない。 例: -----^ test2b.rb j = 2 def foo print defined?(j), "\n" # ==> FALSE j = 1 end foo print j, "\n" # ==> 2 -----$ test2b.rb 【3】定義は、代入を実行することによってなされるのではなく、実行以前に スクリプト中に代入文が現れたときになされる、 例: -----^ test3.rb print defined?(j), "\n" # ==> FALSE j = 1 if FALSE print defined?(j), "\n" # ==> local-variable -----$ test3.rb 【4】定義とは、いわばアクセス権を与えることである。defined?(j) は、 j という名前の変数へのアクセス権の有無を判定する。その場でアクセ ス権がない名前の変数でも、存在していないわけではない。 例: -----^ test4.rb for i in 0..1 print "1)", defined?(j), "\n" j = 1 if FALSE print "2)", j, "\n" j = j+1 end -----$ test4.rb ==> -----^ 1)FALSE 2)nil 1)FALSE 2)1 -----$ イテレータブロック内のローカル変数は、各回ごとに消滅する。 -----^ test4a.rb [0,1].each do |i| print "1)", defined?(j), "\n" j = 1 if FALSE print "2)", j, "\n" j = j+1 end -----$ test4a.rb ==> -----^ 1)FALSE 2)nil 1)FALSE 2)nil -----$ 他にも気をつけることあるかな。 > # これにさらに動的変数が絡むとますますややこしくなるんですけ > # ど,ここでは説明しません. うーん、こわい。気になるなあ。^^;