Groovy Closure повторное использование против регидратированной копии
На странице DSL 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 ответ
Я полагаю, что он возвращает копию, а не использует одно и то же закрытие, чтобы оставаться идемпотентным / безопасным в случае, если вам все еще нужна ссылка на старое закрытие.
Как уже упоминалось @tim_yates, rehydrate
метод устанавливает delegate
, owner
, а также thisObject
в то время как ваш второй пример только устанавливает delegate
, Дело не в том, что rehydrate
Метод делает что-то волшебное, это просто удобный метод, поэтому вам не нужно устанавливать все три свойства по отдельности / построчно.
Я тоже верю rehydrate
предназначен для работы с методом партнера dehydrate
, который возвращает копию замыкания с очищенными этими тремя полями (позволяя rehydrate
легко переустановить их).