2017-12-27 160 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的閉包定義。 –