Groovy'没有方法签名'针对委托运行Closure

时间:2015-01-22 23:01:14

标签: groovy gradle

我有一个关闭作为委托对另一个Groovy对象执行。我能做到:

foo {
    bar {
        major = 1
    }
}

但是当我这样做时:

foo {
    bar {
        major 1
    }
}

我收到错误:

> No signature of method: my.Bar.major() is applicable for argument types (java.lang.Integer) values: [1]
Possible solutions: setMajor(java.lang.Integer), getMajor(), wait(), any(), setMajor(java.lang.String), wait(long)

Bar看起来像:

class Bar {
    Integer major
    Integer getMajor() { return this.major }
    def setMajor(Integer val) { this.major = val }
}

我认为Groovy在处理属性引用时使getter / setter透明,并且引用bar.majorbar.get/setMajor()相同。我是否理解这个错误,或者当您将Closure个委托投入混合时,元类查找路由是否有所不同?解决方案策略为DELEGATE_FIRST

有关更多背景信息:http://forums.gradle.org/gradle/topics/groovy-no-signature-of-method-running-closure-against-delegate

1 个答案:

答案 0 :(得分:1)

您还必须添加void major(Integer val)major = 1 setMajor(1)major 1的常规短片,major(1)println "Hello world" System.out.println "Nice cheese Gromit!" 的缩写。 (见Section Optional parenthesis

  

可选括号

     

如果至少有一个参数并且没有歧义,Groovy中的方法调用可以省略括号。

class X {
    Integer major
    void major(Integer m) { major = m }
}

def x = new X()
x.major = 1 // x.setMajor(1)
assert x.major==1 // x.getMajor()==1
x.major 2 // x.major(2)
assert x.major==2

E.g:

methodMissing

如果您需要此行为,可以为此案例添加class X { Integer major def methodMissing(String name, args) { if (this.hasProperty(name) && args.size()==1) { this."$name" = args[0] } else { throw new MissingMethodException(name, this.class, args) } } } def x = new X() x.major = 1 assert x.major==1 x.major 2 assert x.major==2 。 E.g:

{{1}}