メソッドの動的追加
- Grな日々(uehajの日記): Expandoとは何か (http://d.hatena.ne.jp/uehaj/20080323/1206242516)
コメントで教えてサイトでExpandoに関して多少理解できたが、相変わらず混乱する。ルールをきちんと理解する必要があると感じた。以下のようにExpandoを継承すると動的にメソッド(のようなもの。実際はクロージャ)を追加できる。
class Foo extends Expando { def a def foo() { a=1 bar() } } def f = new Foo() f.bar = {println a} f.foo() //実行結果 1
以下のようにExpandoの特性を持っていないとプロパティbarにアクセスできない。
class Foo { def a def foo() { a=1 bar() } } def f = new Foo() f.bar = {println a} f.foo() //実行結果 groovy.lang.MissingPropertyException: No such property: bar for class: Foo at Foo.setProperty(Script77) at Script77.run(Script77:9)
Expandoを継承するとOKだが、以下のようにbarをプロパティとするとエラー。
class Foo extends Expando { def a def bar def foo() { a=1 bar() } } def f = new Foo() f.bar = {println a} f.foo() //実行結果 java.lang.NullPointerException at Foo.foo(Script79:6) at Foo$foo.call(Unknown Source) at Script79.run(Script79:11)
何でだろう?実行時エラーではなくコンパイル時のエラー?