2016-10-02 33 views
1

我遇到了在Groovy閉包的owner的概念,它搞糊塗了,會發生什麼,所以我寫了一個小程序,以找出如何owner作品:Groovy的:當一個封閉的「主人」是另一種閉合

def examineClosure(closure) { 
    closure() 
} 
examineClosure() { 
    println "$owner" 
    examineClosure() { 
     println "$owner" 
    } 
} 

當我運行這段代碼,不過,我有一個java.lang.StackOverflowError,我以爲是因爲當$owner在內部封閉進行評估的,Groovy實際上是對外部封閉執行.call()含蓄。這是預期的行爲?爲"some var: " + var

回答

0

的語法「$所有者」使用Groovy爲什麼結果不完全相同

examineClosure() { 
    println "$owner" 
    examineClosure() { 
     println "" + owner 
    } 
} 

這是我的理解是,"some var: $var"只是Groovy的簡寫具有以下含義:插入「所有者」變量值作爲字符串進入「」部分。

這是由於GString definition in Groovy造成的。

使用的GString可以像遵循一個例子:

String $outerValue = "groovy GString syntax" 

"This is a String using $outerValue. it makes the String clear and more readable"." 

因此,我不知道該錯誤已與封閉部分。

不幸的是,你的假設:

這是我的理解, 「一些變種:$ VAR」 只是Groovy的 簡寫 「一些VAR:」 + VAR

是錯誤的。

在以下代碼:

examineClosure() { 
    println "$owner" 
    examineClosure() { 
     println "" + owner 
    } 
} 

可變所有者完全沒有限定。

這就是爲什麼你會得到java.lang.StackOverflowError。

+0

變量'this','owner'和'delegate'被隱式定義在Groovy中任何閉包的範圍內:http://groovy-lang.org/closures.html#closure-owner –

+0

但是行:println「」+所有者意味着所有者是一個字符串或實現toString()方法,因此它可以被打印到屏幕上。而且在代碼中看不到任何實現。當你有一個比它可以打印。 – Rotem