2017-12-27 158 views
1

我有下面的代码片段在我Demo.groovy文件的Groovy闭包DELEGATE_ONLY和DELEGATE_FIRST策略不工作

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

任何人可以帮助我了解为什么常规打印NO NAME,而不是用IGOR决心策略设置为DELEGATE_ONLY?

回答

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 
+0

H1可以请你让我知道是什么意思的“一个属性进行访问而无需显式地设置一个接收器对象”和我在哪里设置属性名称的接收器对象。 –

+0

@RameshKP对不起,我不能。这很简单,我的解释和测试的结果。如果在关闭定义时没有定义'name',它将按预期工作。但是这个网站上有很多Groovy专家,所以希望这能够得到解决。 –

+0

其实你是对的:)谢谢你其实def的名字应该是down的闭包定义。 –