2016-11-11 24 views
1

DSL page of groovy它顯示了的Groovy閉包的重用VS補充水分副本

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

換句話說,爲什麼我們需要一個封閉的副本,而不是重複使用給定的副本。我不一定看到使用補水的問題,但我也沒有看到需要,這告訴我有什麼我不理解

+0

'rehydrate'不只是設置代理 –

+0

@tim_yates我知道,它創建了一個克隆。我的問題是更多爲什麼文檔建議使用克隆而不是重複使用同一個對象並避免創建新對象。一定有一個原因 – Hilikus

回答

1

我想它會返回一個副本,而不是重複使用相同的閉包,以便保持冪等/安全的情況下,你仍然需要參考舊的封閉。

如@tim_yates提到的,rehydrate方法設置delegateowner,和thisObject,而第二個示例僅設置了delegate。這並不是說rehydrate方法可以做任何神奇的事情,它只是一種方便的方法,所以您不必單獨/逐行設置所有三個屬性。

我也相信rehydrate意味着與其合作伙伴方法dehydrate,它返回關閉與清除的三個字段(允許rehydrate輕鬆地重新設置)拷貝工作。