【问题标题】:Groovy 'No signature of method' running Closure against delegateGroovy“无方法签名”针对委托运行闭包
【发布时间】:2015-01-22 23:01:13
【问题描述】:

我有一个作为委托针对另一个 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)

栏看起来像:

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

【问题讨论】:

    标签: groovy gradle


    【解决方案1】:

    您还必须添加void major(Integer val)major = 1setMajor(1) 的常规缩写,而 major 1major(1) 的缩写。 (见Section Optional parenthesis

    可选括号

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

    println "Hello world"
    System.out.println "Nice cheese Gromit!"
    

    例如:

    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
    

    如果您非常需要这种行为,您可以为这种情况添加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
    

    【讨论】:

    • 所以基本上我只是不明白属性引用是如何工作的。有没有这方面的详尽文档?我读过official Groovy-bean docs 并没有得出这个结论。
    • 所有关于这些领域的内容都值得一读。但这里适用Optional parenthesis
    • 是的,我知道这是一个方法调用,谢谢(= 我只是认为属性引用扩展到方法调用。我想错了。
    猜你喜欢
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    相关资源
    最近更新 更多