2

groovy 的 DSL 页面中,他们显示了这个

def email(Closure cl) {
  def email = new EmailSpec()
  def code = cl.rehydrate(email, this, this)
  code.resolveStrategy = Closure.DELEGATE_ONLY
  code()
}

他们为什么打电话rehydrate而不是仅仅将委托分配给闭包:

def email(Closure cl) {
  def email = new EmailSpec()
  cl.delegate = email
  cl.resolveStrategy = Closure.DELEGATE_ONLY
  cl()
}

换句话说,为什么我们需要一个闭包的副本而不是重用给定的闭包。我不一定认为使用补水有问题,但我也没有看到需要,这告诉我有些东西我不理解

4

1 回答 1

1

我想它返回一个副本而不是重用相同的闭包,以保持幂等/安全,以防您仍然需要对旧闭包的引用。

正如@tim_yates 提到的,该rehydrate方法设置delegate,ownerthisObject,而您的第二个示例仅设置delegate. 这并不是说该rehydrate方法有什么神奇之处,它只是一种方便的方法,因此您不必单独/逐行设置所有三个属性。

我也相信rehydrate它的目的是使用它的合作伙伴方法dehydrate,它返回一个关闭的副本,其中三个字段被清除(允许rehydrate轻松地重新设置它们)。

于 2016-11-22T18:00:57.567 回答