2016-10-02 4 views
1

私はGroovyでクロージャーのownerの概念に出くわし、それは私を混同しているとき、何が起こるので、私は把握する小さなプログラムを書いたのかowner作品:Groovyは:クロージャの「所有者」とは別の閉鎖

私はこのコードを実行したとき

def examineClosure(closure) { 
    closure() 
} 
examineClosure() { 
    println "$owner" 
    examineClosure() { 
     println "$owner" 
    } 
} 
は、しかし、私は私が $ownerが、内側の閉鎖で評価されたときに、Groovyのは実際には、外側の閉鎖は、暗黙のうちに .call()を実行しているためであると仮定し java.lang.StackOverflowErrorを得ました。これは予想される動作ですか? 「所有者」変数の値を挿入します。なぜ、その結果、 "some var: $var"はGroovyのを使用して、構文「$の所有者が」次のことを意味し "some var: " + var

答えて

0

ため、単純にGroovyの省略形だったというのが私の理解だった

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

と同一ではないでしょう""セクションに文字列として入力します。

GString definition in Groovyが原因です。 Gストリングを使用するための

例以下のようになります

String $outerValue = "groovy GString syntax" 

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

したがって、私はあなたが閉鎖セクションにエラー関連していることを確認していません。

残念ながら、あなたの仮定: ":$のVAR一部varが" 速記 "は、いくつかのVAR:" のために、単純なGroovyた+ 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 "" + ownerは、所有者がStringであるか、toString()メソッドを実装しているので、スクリーンに印刷することができます。私はあなたのコードでその実装を見ていません。あなたがそれを持っているときはそれを印刷することができます。 – Rotem

関連する問題