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我知道,它创造了一个克隆。我的问题是,为什么文档建议使用克隆,而不是重复使用同一对象,并避免创建新对象。一定有原因