为什么Grails中的某些taglib会返回一个Closure?

时间:2016-11-22 17:41:18

标签: grails

为什么Grails中的某些核心taglib会返回一个闭包?例如createLinksee source)?有什么好处或用例?

1 个答案:

答案 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的调用可能会随着时间的推移而略有变化,因为对其进行了增强或添加(希望)对以前使用它的影响很小或没有影响。

希望这有助于解释您所看到的内容以及可能的原因。