2016-11-22 1 views
0

Grailsの中核となるいくつかのタグライブラリがクロージャを返すのはなぜですか?例えば、createLinksee source)?メリットやユースケースは何ですか?GrailsのいくつかのtaglibがClosureを返すのはなぜですか?

+1

これは、 'Closure'型のプロパティで、すぐに割り当てられるクロージャを取得します。 – cfrick

+0

はい、ドキュメントの例では暗黙的に 'org.codehaus.groovy.grails.web.util.StreamCharBuffer'しか返されないので、なぜClosureを返すのか分かりません – iberck

答えて

3

実際に見ているのは、がClosureと定義されていて、実行時にClosureが返されるというわけではありません。クロージャ自体が実行され、StreamCharBufferの実際の作成を担当する実装を委任します。 のソースを見て、本当に何が起こっているか見てみましょう:

Closure createLink = { attrs -> 
    return doCreateLink(attrs instanceof Map ? (Map) attrs : Collections.emptyMap()) 
} 

を我々はそれがdoCreateLinkに作業を委任しますタイプClosurecreateLinkという変数を持っている上に、あなたが見ることができるように。そのクラスを含むクラス内の保護されたメソッドです。

protected String doCreateLink(Map attrs) { 
    ... // actual implementation cut out of this example 
    return useJsessionId ? res.encodeURL(generatedLink) : generatedLink 
} 

あなたがこれを見ることができるように、実際の作業は(うまくキャストされ、まあ、StringStreamCharBufferを生成するために行われているところです。

なぜ、これをやりますか? 1つの使用可能なケースは、メソッドdoCreateLinkが正式な定義のクロージャcreateLinkよりはるかに厳密です。メソッドの代わりにClosureを使用すると、createLinkへの呼び出しは、以前の用途にほとんどまたはまったく影響を与えずに、機能強化や追加が行われるため、時間の経過とともにわずかに変更される可能性があります。

これは、あなたが見ているものと、おそらく理由について少し説明するのに役立ちます。

関連する問題