Groovy Closure重用与再水合副本

时间:2016-11-11 20:50:29

标签: groovy dsl groovydsl

在他们展示的DSL page of groovy

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()
}

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

1 个答案:

答案 0 :(得分:1)

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

正如@tim_yates所述,rehydrate方法设置delegateownerthisObject,而您的第二个示例仅设置delegate。并不是rehydrate方法做任何神奇的事情,它只是一种方便的方法,所以你不必逐个/逐行地设置所有三个属性。

我还认为rehydrate旨在使用其合作伙伴方法dehydrate,该方法会返回关闭的副本,并清除这三个字段(允许rehydrate轻松重新设置它们)。