Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Groovy闭包仅DELEGATE_和DELEGATE_优先策略不起作用_Groovy - Fatal编程技术网

Groovy闭包仅DELEGATE_和DELEGATE_优先策略不起作用

Groovy闭包仅DELEGATE_和DELEGATE_优先策略不起作用,groovy,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关于闭包策略的文档 我期望得到以下结果 伊戈尔 然而,代码

我的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关于闭包策略的文档

我期望得到以下结果

伊戈尔

然而,代码似乎是打印出来的

没有名字


有谁能帮助我理解为什么groovy打印NO NAME而不是IGOR,而resolve strategy设置为仅授权?

文档中说:

无论何时,在闭包中,在不显式设置接收方对象的情况下访问属性,都会涉及委派策略

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

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

这不是一个非常清晰的例子来展示授权。 为了正确地进行委派,我们需要有一个所有者和另一个委派。 请参阅以下内容以更好地理解:

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()​
这里,当仅应用委托_时,将调用StringBuffer的append(),
否则将调用脚本中声明的append方法。

Hi您能告诉我“在不显式设置接收方对象的情况下访问属性”是什么意思吗?我在哪里为属性名称设置接收方对象。@RameshKP很抱歉,我不能。这是我简单的解释和测试结果。如果在闭包定义时未定义
名称
,则它会按预期工作。但是这个网站上有很多Groovy专家,所以希望这能得到解决。实际上你是对的:)谢谢你,实际上def name应该在闭包定义中。