LoginSignup
50
35

More than 5 years have passed since last update.

レキシカルスコープ/ダイナミックスコープとは?

Last updated at Posted at 2015-12-05

そもそも、スコープには二種類ある。

  1. レキシカルスコープ
  2. ダイナミックスコープ

それぞれは、変数の参照の仕様のことであり、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等が何故採用したのか?に対してそうやって書いてあるらしいです。笑

50
35
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
50
35