0
爲什麼Grails中的一些核心taglib會返回閉包?例如createLink
(see source)?什麼是好處或用例?爲什麼Grails中的一些taglib會返回一個Closure?
爲什麼Grails中的一些核心taglib會返回閉包?例如createLink
(see source)?什麼是好處或用例?爲什麼Grails中的一些taglib會返回一個Closure?
所以,你實際看到的是createLink
被定義爲Closure
,而不是它在執行時返回Closure
。閉包本身被執行並委託負責創建StreamCharBuffer
的實際工作的實現。 讓我們來看看源,看看究竟發生了什麼事情:
Closure createLink = { attrs ->
return doCreateLink(attrs instanceof Map ? (Map) attrs : Collections.emptyMap())
}
正如你可以看到上面有一個名爲Closure
類型的代表是工作doCreateLink
的createLink
變量。這恰好是包含類中的受保護方法。
protected String doCreateLink(Map attrs) {
... // actual implementation cut out of this example
return useJsessionId ? res.encodeURL(generatedLink) : generatedLink
}
正如你可以看到這是在實際工作完成後,生成StreamCharBuffer
(好吧,String
,這很好地蒙上)。
現在,你爲什麼要這樣做?一種可能的用例是,方法doCreateLink
比正式定義中的關閉createLink
嚴格得多。通過使用Closure
而不是方法,對createLink
的調用可以隨着時間的推移而略微改變,因爲對其進行了增強或增加(希望對其以前的用途影響很小或沒有影響)。
希望這有助於解釋一些關於你所看到的和可能的原因。
這是'Closure'類型的屬性,它可以立即分配一個閉包。 – cfrick
是的,但在文檔中的例子只隱含'org.codehaus.groovy.grails.web.util.StreamCharBuffer'返回,所以我不明白爲什麼返回一個閉包 – iberck