首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何更改Groovy脚本的默认闭包解析策略?

如何更改Groovy脚本的默认闭包解析策略?
EN

Stack Overflow用户
提问于 2013-06-24 17:10:21
回答 1查看 932关注 0票数 0

我正在编写一个包含大量全局属性和闭包的大型Groovy脚本。所有的闭包都被用来向现有的类添加新方法,例如:

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
MyClass.metaClass.evaluate = { ->
    delegate.myProperty = 'bar'
}

def mc = new MyClass()
mc.evaluate()
println mc.myProperty // prints out "bar" as desired

2)将闭包的解决策略设置为DELEGATE_ONLY:

代码语言:javascript
代码运行次数:0
运行
复制
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解析策略?这可能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-25 07:48:25

据我所知,无法更改默认的委托策略,据我所见,您有两个选项:

  1. 将脚本拆分为类(因此,脚本级别的myProperty和类级别的myProperty不在同一范围内)
  2. 编写一个方法来更改resolveStrategy,并在设置metaClass时调用它,即: 只def (闭包c){ c.resolveStrategy = Closure.DELEGATE_ONLY c} MyClass.metaClass.evaluate =只{ -> myProperty = 'bar‘}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17281119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档