2016-03-28 7 views
0

"Groovy in Action"によると、クロージャーはいくつかの方法で宣言できます。いくつかの方法: DEFプリンタ= {線 - >のprintlnライン} DEFクロージャGETPRINTER(){ 戻り{線 - >のprintlnライン} }Groovyクロージャーのオーナー

閉鎖にClosures, official documentationownerによれば

"それはクロージャやクラスである、直接囲むオブジェクトを返します。"どちらの場合も

class Mother { 
    def prop = 'prop' 
    def method(){ 'method' } 
    Closure birth (param) { 
     def local = 'local' 
     def closure1 = { 
      [ this, prop, method(), local, param ] 
     } 
     return closure1 
    } 

    def birth2 = { param -> 
     def local = 'local' 
     def closure2 = { 
      [ this, prop, method(), local, param ] 
     } 
     return closure2 
    } 
} 
Mother julia = new Mother() 
def closure = julia.birth('param') 
assert closure.owner == julia 
assert closure.delegate == julia 

def closure2 = julia.birth2('param') 
assert closure2.owner == julia 
assert closure2.delegate == julia 

birth2はマニュアルに従って閉鎖されているbirth ANB:

[OK]を、のを見てみましょう。これらのクロージャ内では、closure1closure2と宣言します。私は彼らに言及するだけの名前を付けました。このclosure1closure2の所有者は、birthbirth2を参照してください。公式の文書によると。しかし、最初の例ではownerはクラスjuliaのインスタンスを指します。 2番目の例では、それはbirth2を参照していると信じていますが、それをアサートする方法はわかりません。

誰でもその違いを説明できますか?

答えて

0

birth

birth2

は、内部が内部クラスI宣言するときことを意味

+0

差にあるクロージャをなし閉鎖、方法であって、閉鎖GETPRINTER(){戻り{線デフ - > println line}}これはメソッドであり、クロージャではありません。そして、明示的な "Closure"はこの場合何も意味しませんか? – Alexandr

+2

これは戻り値の型です。したがって、クロージャを返すメソッドです。 –

+0

と同様に 'int add(int a、int b){a + b}'は2つのintを受け取り、intを返すメソッドです。 'Closure method(String a){{ - > a * 2}}'メソッドそれは文字列を受け取り、Closureを返します。 –

関連する問題