Groovy闭包重用与再水化拷贝

Groovy闭包重用与再水化拷贝,groovy,dsl,groovydsl,Groovy,Dsl,Groovydsl,在电影中,他们展示了这一点 def email(Closure cl) { def email = new EmailSpec() def code = cl.rehydrate(email, this, this) code.resolveStrategy = Closure.DELEGATE_ONLY code() } 为什么他们调用重新水化,而不只是将委托分配给闭包: def email(Closure cl) { def email = new EmailSpec(

在电影中,他们展示了这一点

def email(Closure cl) {
  def email = new EmailSpec()
  def code = cl.rehydrate(email, this, this)
  code.resolveStrategy = Closure.DELEGATE_ONLY
  code()
}
为什么他们调用
重新水化
,而不只是将委托分配给闭包:

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

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

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

正如@tim_yates所提到的,该方法设置
委托
所有者
、以及
此对象
,而您的第二个示例仅设置
委托
。这并不是说
再水化
方法有什么神奇的作用,它只是一种方便的方法,因此您不必单独/逐行设置所有三个属性


我还认为,
rehydrate
意味着与它的合作伙伴方法一起工作,它返回一个已清除这三个字段的闭包副本(允许
rehydrate
轻松地重新设置它们)。

rehydrate
不仅仅是设置delegate@tim_yates我知道,它创造了一个克隆。我的问题是,为什么文档建议使用克隆,而不是重复使用同一对象,并避免创建新对象。一定有原因