我正在编写一个包含许多全局属性和闭包的大型 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 来避免在我的闭包中到处都有“委托”,但我不喜欢为我创建的每个闭包设置解决策略。
我如何告诉 Groovy 默认对所有闭包使用 DELEGATE_ONLY 解析策略?这甚至可能吗?