多数のグローバル プロパティとクロージャを含む大規模な Groovy スクリプトを作成しています。すべてのクロージャーは、新しいメソッドを既存のクラスに追加するために使用されています。
myProperty = 'foo'
// ...more script code...
class MyClass {
def myProperty = 'default'
}
// ...more script code...
MyClass.metaClass.evaluate = { ->
myProperty = 'bar'
}
def mc = new MyClass()
mc.evaluate()
println mc.myProperty // prints out "default" instead of "bar"
私の意図は、クロージャーがグローバルクラスではなくmyProperty
デリゲートクラスを参照することです。myProperty
これに対処する方法をいくつか見つけました。
delegate
1)クロージャー内での明示的な逆参照:
MyClass.metaClass.evaluate = { ->
delegate.myProperty = 'bar'
}
def mc = new MyClass()
mc.evaluate()
println mc.myProperty // prints out "bar" as desired
2) クロージャーの解決戦略を DELEGATE_ONLY に設定します。
def evalClosure = { ->
myProperty = 'bar'
}
evalClosure.resolveStrategy = Closure.DELEGATE_ONLY
MyClass.metaClass.evaluate = evalClosure
def mc = new MyClass()
mc.evaluate()
println mc.myProperty // prints out "bar" as desired
クロージャー内のいたるところに「デリゲート」を配置することを避けるために、アプローチ #2 を使用したいと思いますが、作成するクロージャーごとに解決戦略を設定する必要はありません。
デフォルトですべてのクロージャに対して DELEGATE_ONLY 解決戦略を使用するように Groovy に指示するにはどうすればよいですか? これは可能ですか?