Groovy调用字段

Groovy调用字段,groovy,Groovy,我试图在字段中放入一个支持调用操作的对象,然后调用他。我可以在变量中不使用中间读取字段吗? 我的尝试如下所示: class CallableObjectDynamic { def call() { return "5" } } class MyClassDynamic { CallableObjectDynamic field = new CallableObjectDynamic() } class GroovyRunnerDynamic {

我试图在字段中放入一个支持调用操作的对象,然后调用他。我可以在变量中不使用中间读取字段吗? 我的尝试如下所示:

class CallableObjectDynamic {
    def call() {
        return "5"
    }
}


class MyClassDynamic {
    CallableObjectDynamic field = new CallableObjectDynamic()
}

class GroovyRunnerDynamic {
    static String make(int arg1) {
        MyClassDynamic x = new MyClassDynamic()
        return x.field()
    }
}
​ 但是我收到了
groovy.lang.MissingMethodException


你能做什么?或者有人能证明我们不能调用字段吗?

这是一个微不足道的问题。
字段
不需要括号

更改为:

return x.field()
致:

如果要进一步执行
调用
方法,请使用下面的代码段。
请注意,
静态
方法返回类型已更改

类CallableObjectDynamic{
def call(){
返回“5”
}
}
类MyClassDynamic{
CallableObjectDynamic字段=新建CallableObjectDynamic()
}
GroovyRunnerDynamic类{
静态def生成(int arg1){
MyClassDynamic x=新的MyClassDynamic()
返回x.field
}
}
​GroovyRunnerDynamic.make(1)​.调用()​
输出为:5
不确定为什么在这里执行
make
方法的参数,似乎在上面的代码中没有使用

或者,您可以更改

class GroovyRunnerDynamic {
    static def make(int arg1) {
        MyClassDynamic x = new MyClassDynamic()
        return x.field.call()
    }
}

​GroovyRunnerDynamic.make(1)
编辑:基于OP的隐式调用。
不太确定它是如何工作的,但下面的代码确实是隐式调用。只需将
x.field
分配给一个变量,并为其添加括号,如下所示

class GroovyRunnerDynamic {
    static String make(int arg1) {
        MyClassDynamic x = new MyClassDynamic()
        def fun = x.field
        fun()
    }
}
GroovyRunnerDynamic.make(1)
成员资格(
)的优先级低于函数/方法/调用(
()
)。因此,这一行:

        return x.field()
解释为“调用“
x
”对象上的“
字段”
”方法

要让Groovy按照您的意愿解析代码,最小的更改是使用括号重新组合,如下所示:

        return (x.field)()

根据需要,它(最终)被解释为“在“
x
”对象的“
字段
”对象成员上调用“
调用
”方法。

在示例中,您必须返回
42
,是否要使用隐式
调用
方法?@injecteer是的,我只想要隐式调用更改
返回x.field()
返回(x.field)(
)。成员资格的优先级低于函数调用。J Di或Eximen,您是否考虑接受这两个答案中的一个?很抱歉,也许我没有集中精力,但重要的是要意识到这是对函数的隐式调用并返回其结果。@jdioeximen,请查看编辑后的答案是否有帮助。谢谢,它之所以有效,是因为我们读入了类型为
CallableObjectDynamic
的变量
fun
对象。调用
fun()
后,我们隐式调用操作符
call
。这种情况与我在示例中所期望的唯一不同之处是,我们提示Groovy此处的内容是读取字段,此处是方法调用。我正在做编译器研究,在我看来,这是一个我们无法调用该字段的bug。我认为我不知道Groovy语言的一些微妙之处。现在看来,你的建议是唯一的解决办法invocation@JDiOrEximen,如果您认为这是最好的解决方案,请将其视为答案并投票选出有用的答案。
        return (x.field)()