我正在编写一个包含大量全局属性和闭包的大型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
,而不是全局的。我找到了几种处理这个问题的方法:
1)在闭包中显式取消引用delegate
:
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解析策略?这可能吗?
发布于 2013-06-24 23:48:25
据我所知,无法更改默认的委托策略,据我所见,您有两个选项:
myProperty
和类级别的myProperty
不在同一范围内)resolveStrategy
,并在设置metaClass
时调用它,即:
只def (闭包c){ c.resolveStrategy = Closure.DELEGATE_ONLY c} MyClass.metaClass.evaluate =只{ -> myProperty = 'bar‘}https://stackoverflow.com/questions/17281119
复制