そもそも、スコープには二種類ある。
- レキシカルスコープ
- ダイナミックスコープ
それぞれは、変数の参照の仕様のことであり、Ruby、Java、Javascript、python等多くのメジャーな言語でレキシカルスコープが採用されています。
レキシカルスコープの例
非常に単純です。以下のコードを見て下さい。
var = '私はトップレベル'
def a_method
return var
end
def b_method
var = '私はオブジェクトの中身'
return var
end
a_method
#-> '私はトップレベル'
Ruby等を書いていると当たり前ですが、a_methodからb_methodのvarを参照することは出来ません。
これが レキシカルスコープ
です...!!!
しかし、世の中には関数を評価した時に変数のスコープが決定する言語があるらしいです。
それらをダイナミックスコープと呼ぶらしいですが、例えばLispとかEmacs等はそれらのスコープを採用しているらしいです。
ダイナミックスコープの例
これはRubyではありません。Rubyっぽいダイナミックスコープを採用しているDynamicRubyです。(そんなものはありませんが、造語です。)
def a_method
p var
end
def b_method
var = '私はBです。'
a_method
end
def c_method
a_method
end
b_method
#-> '私はBです。'
c_method
#-> undefined variable 'var'
となるでしょう。
つまり、関数を定義した時にスコープが決定するのではなく、 関数を評価するときにスコープが決定します。
ダイナミックスコープのメリット
言語を実装することが簡単らしいですw
Lisp やEmacs等が何故採用したのか?に対してそうやって書いてあるらしいです。笑