Я точно не знаю, что делает метод sendMail, поскольку у меня нет книги, о которой вы упоминаете. Метод sendMail действительно требует закрытия, как вы описали, но он, вероятно, использует строитель , а не выполняется обычным способом. По сути, это был бы специфичный для домена язык для описания отправляемого электронного письма.
Причина, по которой класс, который вы определили, не будет работать, состоит в том, что область действия замыкания там, где оно объявлено, а не там, где оно запускается. Таким образом, если ваше закрытие вызывает метод to (), он не сможет вызвать метод to в MailService, если вы не передали экземпляр почтового сервиса в замыкание.
С несколькими модификациями ваш пример может работать, хотя и с использованием обычного замыкания. Следующие изменения в вызове и
// The it-> can be omitted but I put it in here so you can see the parameter
service.sendMail {it->
it.to "foo@example.org"
it.subject "Registration Complete"
it.body view:"/foo/bar", model:[user:new User()]
}
Метод sendMail в классе должен выглядеть следующим образом
def sendMail(closure) {
closure(this)
// Code to send the mail now that all the
// various properties have been set
}