クロージャのレキシカルスコープ
インスタンス変数とローカル変数の参照するときの書き方は同じなので、クロージャのレキシカルスコープは非常に混乱しやすいと思った。例えば以下の例。まずは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との互換性問題かな。