为什么Grails中的某些核心taglib会返回一个闭包?例如createLink
(see source)?有什么好处或用例?
答案 0 :(得分:3)
所以,您实际看到的是createLink
被定义为Closure
,而不是它在执行时返回Closure
。闭包本身被执行并委托实现,该实现负责创建StreamCharBuffer
的实际工作。
让我们看看源代码,看看到底发生了什么:
Closure createLink = { attrs ->
return doCreateLink(attrs instanceof Map ? (Map) attrs : Collections.emptyMap())
}
如上所示,我们有一个名为createLink
的{{1}}类型的变量,它将其工作委托给Closure
。这恰好是包含类中的受保护方法。
doCreateLink
正如您所看到的,这是完成实际工作的地方,以生成protected String doCreateLink(Map attrs) {
... // actual implementation cut out of this example
return useJsessionId ? res.encodeURL(generatedLink) : generatedLink
}
(嗯,StreamCharBuffer
,它很好地投射)。
现在,你为什么要这样做?一个可能的用例是,方法String
比正式定义中的闭包doCreateLink
严格得多。通过使用createLink
代替该方法,对Closure
的调用可能会随着时间的推移而略有变化,因为对其进行了增强或添加(希望)对以前使用它的影响很小或没有影响。
希望这有助于解释您所看到的内容以及可能的原因。