我的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?
答案 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方法。