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 легко переустановить их).

Другие вопросы по тегам