2016-06-14 1 views
0

если я изменю код в Groovy DSL Doc здесь.как передать параметры закрытию, если использовать @DelegatesTo аннотация?

добавить строку «привет мир» на электронную почту, как этот

email('hello world') { // change here 
    from '[email protected]' 
    to '[email protected]' 
    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, чтобы получить строку «привет мир» ??

ответ

0

Да, я нашел способ, но не совершенен.

Простой

new EmailSpec(name) // change to 

однако, я действительно хочу, чтобы использовать заводной вызов функции (имя), чтобы решить его

0

Честно декомпилировать, что закрытие будет вызвана с параметром вам необходимо добавить 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.

Для получения более подробной информации см. Раздел The @ClosureParams annotation в документальной документации.

Смежные вопросы