如果使用@DelegatesTo注释,如何将参数传递给闭包?

时间:2016-06-14 03:37:52

标签: groovy groovydsl

如果我在此更改Groovy DSL Doc中的代码。

添加一些字符串' hello world'发送电子邮件,像这样

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 个答案:

答案 0 :(得分:1)

告诉编译器将使用参数调用闭包,您需要添加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

有关详细信息,请参阅groovy文档中的The @ClosureParams annotation部分。

答案 1 :(得分:0)

是的,我找到了一种方法,但并不完美。

简单

new EmailSpec(name)  // change to 

然而,我真的想使用groovy函数调用(名称)来解决它