2017-09-08 8 views
0

groovyでクロージャ/メソッドの上書きを学習するために次のコードを書いています。私はその行動を理解できませんでした。Groovyでランタイムクロージャ/メソッドの上書きを理解しようとしています

class AClass { 
    def closure1 = { -> println "hello from closure1 - ${this.toString()}" } 

    def closure2 = { c1 -> 
     print "closure2 { \n " 
     c1() 
     println "}" 
    } 
} 

def obj = new AClass() 
print "1: " 
obj.closure1() 

//over write closure1 
obj.metaClass.closure1 = { -> println "hello from *** overridden closure1 *** - ${this.toString()}".toUpperCase()} 
print "\n2: " 
obj.closure1() //To confirm closure1 was indeed overwritten 

//call closure2 
print "\n3: " 
obj.closure2 (obj.closure1) 
print "\n4: " 
obj.closure2 {obj.closure1()} 

私は同じ結果を生成するために2つのclosure2の呼び出しを期待していたが、どうやらそうではありません。

以下は私のコードを実行した結果です。あなたがここに二つの異なるものを持っている

1: hello from closure1 - [email protected] 

2: HELLO FROM *** OVERRIDDEN CLOSURE1 *** - [email protected] 

3: closure2 { 
    hello from closure1 - [email protected] 
} 

4: closure2 { 
    HELLO FROM *** OVERRIDDEN CLOSURE1 *** - [email protected] 
} 

答えて

0

...変数の閉鎖を保持しclosure1、および閉鎖を経由してあなたがメタクラスに追加した方法closure1 ...

obj.closure2 (obj.closure1) 

コールのclosure2 、可変

obj.closure2 {obj.closure1()} 

に通過はメタクラス

でクロージャを呼び出すクロージャを渡し

彼らは非常に異なるものです

あなただけの彼らに同じ

+0

ああと呼ばれてきた...私は今ようやく明らかです。私はメソッドとプロパティ(Closureオブジェクト)の間で混乱していました。ありがとうございました! –

関連する問題