Как передать параметры в замыкание, если использовать аннотацию @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 вызов функции (имя), чтобы решить ее

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