Как передать параметры в замыкание, если использовать аннотацию @DelegatesTo?
Если я изменю код в Groovy DSL Doc здесь.
добавить строку "Привет мир" на электронную почту, как это
email('hello world') { // change here
from 'dsl-guru@mycompany.com'
to 'john.doe@waitaminute.com'
subject 'The pope has resigned!'
body {
p 'Really, the pope has resigned!'
}
}
и изменить
def email(def name, @DelegatesTo(EmailSpec) Closure cl) { // change here
def email = new EmailSpec()
def code = cl.rehydrate(email, this, this)
code.resolveStrategy = Closure.DELEGATE_ONLY
code.call(name) // change here
}
Итак, как изменить класс EmailSpec, чтобы получить строку 'Hello World'??
2 ответа
Чтобы сообщить компилятору, что замыкание будет вызываться с параметром, необходимо добавить ClosureParams
аннотаций.
Чтобы придерживаться вашего примера:
def email(def name,
@ClosureParams(value = SimpleType, options = "java.lang.String")
@DelegatesTo(EmailSpec) Closure cl) {
def email = new EmailSpec()
def code = cl.rehydrate(email, this, this)
code.resolveStrategy = Closure.DELEGATE_ONLY
code.call(name) // change here
}
скажет компилятору, что первый параметр String
,
Для более подробной информации смотрите раздел Аннотация @ClosureParams в отличной документации.
Да, я нашел способ, но не идеальный.
просто
new EmailSpec(name) // change to
Тем не менее, я действительно хочу использовать Groovy вызов функции (имя), чтобы решить ее