Groovy 闭包 DELEGATE_ONLY 和 DELEGATE_FIRST 策略不起作用

标签 groovy

我的 Demo.groovy 文件中有以下代码片段

class Person {
    String name
}
def name='no name'
def p = new Person(name:'Igor')
def cl = { name.toUpperCase() }
cl.resolveStrategy = Closure.DELEGATE_ONLY
cl.delegate = p
println cl()

根据Groovy文档关于关闭策略http://groovy-lang.org/closures.html

我期望以下输出

伊戈尔

但是代码似乎打印

没有名字

任何人都可以帮助我理解为什么 groovy 在解析策略设置为 DELEGATE_ONLY 的情况下打印 NO NAME 而不是 IGOR 吗?

最佳答案

文档说:

Whenever, in a closure, a property is accessed without explicitly setting a receiver object, then a delegation strategy is involved

在您的示例中,情况并非如此,其中定义了变量name。删除它,或者将其移到 closere 的定义之后,您将看到预期的结果

class Person {
    String name
}
def p = new Person(name:'Igor')
def cl = { name.toUpperCase() }
def name='no name'
cl.resolveStrategy = Closure.DELEGATE_ONLY

cl.delegate = p
println cl()

IGOR

关于Groovy 闭包 DELEGATE_ONLY 和 DELEGATE_FIRST 策略不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47994435/

相关文章:

ajax - 继续对表数据进行Ajax调用,直到找不到文本为止

xml - Groovy:使用 StreamingMarkupBuilder 处理大量数据

grails - ImageMagick 和 Grails 不工作

logging - 为什么自动注入(inject)日志对象并不总是在 grails 中工作?

mysql - 使用 Groovy SQL 更新的更快方法

grails - 从我不想持久化的getter方法返回默认实例

regex - groovy:如何在 textarea 中转义 "("正则表达式等?

grails - 整数枚举和g:select

groovy - 使用 groovy 运行测试套件和测试用例?

testing - Jmeter postProcessor 仅在所有 http 请求完成后执行一次