2016-04-30 5 views
0

私はGroovyを使い慣れていません。私は専門書類でクロージャを勉強しています。 The 'delegate of a closure' topicは怒鳴る例を示します:なぜこのクロージャーコールは再帰呼び出しで終了しないのですか?

enter image description here

ので、数5で、私はそのデリゲートがケースに囲まれた閉鎖enclosedであることを、所有者にデフォルトに設定されている知っています。

それでは、なぜ再帰呼び出しで終わるしないenclosedクロージャ内

{ -> delegate }.call() 

を呼び出しますか?私の再帰のように見えますが、コードを実行すると再帰ではありません。ここで私は何が欠けているのですか?

答えて

2
def enclosed = { 
    // delegate == owner == enclosed (variable) 
    { -> 
     // When this closure is called return the delegate (enclosed) 
     delegate 
    }.call() // Called immediately       

    // above closure is same as writing 
    // return delegate 
} 

// When enclosed in called the delegate is returned immediately 
// from the invocation of the inner closure, hence the result of the 
// closure call is the closure (delegate) itself 
assert enclosed() == enclosed 

何がenclosed()が呼び出されるまでは発生しませんenclosed閉鎖の内側に発生すると仮定されていることに注意してください。 :)それは今、鮮明な画像を描いていますか?

+0

@Emmanuel Rosaが再帰的な呼び出しに '{ - > delegate} .call()。call()'が必要であるという答えをあなたの答えに入れてください。私はこれが質問にとって非常に重要だと思います。ありがとう! – reinaldoluckman

+0

私は同意するだろうが、最初に質問された質問には関係がないと感じた。質問は「私は何が欠けていますか?」でした。答えは閉鎖がどのように働くかを理解することでした。疑いなく、.call().call()は再帰を引き起こしますが、コードブロック全体は無意味です。さらに、.call()が.call()をもう一度呼び出すことができる「Closure」を返すことを、コードを見て別にどうやって確認しますか?最初に.call() 'instanceof' Closureをチェックしてから.call()を実行すると良いでしょう。私はあなたにこれを手伝ってくれてうれしいです。 – dmahapatro

2

enclosedクロージャでは{ -> delegate }.call()を呼び出しても、別のクロージャでcall()が呼び出されるため、クロージャは再帰呼び出しを行いません。 enclosedで作成されたもの。再帰呼び出しを取得するには、{ -> delegate }.call().call()を実行します。最初のcall()enclosedを返し、2番目がそれを呼び出します。

関連する問題