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

时间:2017-12-27 15:10:14

标签: 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

我期待以下输出

IGOR

然而代码似乎打印

NO NAME

任何人都可以帮助我理解为什么groovy打印NO NAME而不是IGOR并将解析策略设置为DELEGATE_ONLY?

2 个答案:

答案 0 :(得分:0)

文档说:

  

每当在闭包中访问属性而不显式设置接收器对象时,就会涉及委派策略

在您的示例中并非如此,其中定义了变量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

答案 1 :(得分:0)

此ISNT是一个非常干净的示例来演示委派。 为了正确进行委派,我们需要有一个所有者和另一位代理。 请参阅此以获得更好的理解:

def cl = {
    append 'Groovy'
    append 'DSL'
}

String append(String s) {
    println "appending $s"
}

StringBuffer sb = new StringBuffer()
cl.resolveStrategy = Closure.DELEGATE_ONLY
cl.delegate = sb
println(cl.delegate.class)
println cl()​

在这里,当应用DELEGATE_ONLY时,将调用StringBuffer的append(), 否则将调用脚本中声明的append方法。