クロージャのレキシカルスコープ

インスタンス変数とローカル変数の参照するときの書き方は同じなので、クロージャのレキシカルスコープは非常に混乱しやすいと思った。例えば以下の例。まずはaをローカル変数とした場合。foo内のaはローカル変数で、f.a=2のaはプロパティということだと思う。

class Foo extends Expando {
  def foo() {
    a=1
    bar = {println a}
    bar()
  }
}
def f = new Foo()
f.a=2
f.foo()

//実行結果
1

aをインスタンス変数とした場合。foo内のaもf.a=2のaも両方プロパティということだと思う。

class Foo extends Expando {
  def a
  def foo() {
    a=1
    bar = {println a}
    bar()
  }
}
def f = new Foo()
f.a=2
f.foo()

//実行結果
2

インスタンス変数の参照で、「this.」を省略できるのでローカル変数と区別がない。Pythonでは必ず、「self.」を書かなくてはならないので区別が容易。またJavaとの互換性問題かな。