2016-11-11 3 views
1

Im DSL page of groovy sie zeigen dieseGroovy Closure Wiederverwendung vs Rehydrate Kopie

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

Warum fordern sie rehydrate statt Zuweisung nur die Delegierten der Schließung:

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

Mit anderen Worten, warum tun wir brauchen eine Kopie des Verschlusses, anstatt den gegebenen wieder zu verwenden. Ich sehe nicht unbedingt ein Problem mit rehydrieren, aber ich sehe auch nicht die Notwendigkeit, die mir sagt, dass ich etwas nicht verstehe

+0

'rehydrate' setzt nicht nur den Delegaten –

+0

@tim_yates Ich weiß, es erstellt einen Klon. Meine Frage ist mehr, warum das Dokument einen Klon empfiehlt, anstatt dasselbe Objekt wieder zu verwenden und zu vermeiden, ein neues Objekt zu erstellen. Dafür muss es einen Grund geben – Hilikus

Antwort

1

Ich stelle mir vor, dass es eine Kopie zurückgibt, anstatt die gleiche Schließung wieder zu verwenden bleibe idempotent/sicher, falls du noch einen Hinweis auf den alten Verschluss benötigst.

@tim_yates Wie erwähnt, ist die rehydrate Methode setzt den delegate, owner und thisObject, während Ihr zweites Beispiel nur die delegate setzt. Es ist nicht so, dass die Methode rehydrate etwas Magisches macht, es ist nur eine bequeme Methode, so dass Sie nicht alle drei Eigenschaften einzeln/Zeile für Zeile einstellen müssen.

ich auch rehydrate glauben sollte mit seinem Partner Methode dehydrate, arbeiten, die gelöscht eine Kopie des Verschlusses mit diesen drei Feldern zurück (so dass rehydrate zu leicht, sie wieder eingestellt).