我试图在字段中输入一个支持呼叫操作的对象,然后给他打电话。我可以在变量中没有中间读取字段的情况下完成吗? 我的尝试看起来像这样:
groovy.lang.MissingMethodException
但我收到huxtable
。
你能做什么?或者,任何人都可以提供一份证据,证明我们无法称之为该领域吗?
答案 0 :(得分:1)
成员资格(.
)的优先顺序低于函数/方法/调用调用(()
)。这一行:
return x.field()
被解释为“在”field
'对象上调用“x
”方法。
要让Groovy根据需要解析代码,最小的改变是使用括号重新组合,如下所示:
return (x.field)()
根据需要(最终)被解释为“在call
'对象的'field
'对象成员上”调用'x
'方法。
答案 1 :(得分:0)
这是一个微不足道的问题。不需要为field
添加括号。
更改自:
return x.field()
要:
return x.field
如果您想进一步执行call
方法,请使用下面的代码段。
请注意,static
方法返回类型已更改。
class CallableObjectDynamic {
def call() {
return "5"
}
}
class MyClassDynamic {
CallableObjectDynamic field = new CallableObjectDynamic()
}
class GroovyRunnerDynamic {
static def make(int arg1) {
MyClassDynamic x = new MyClassDynamic()
return x.field
}
}
GroovyRunnerDynamic.make(1).call()
输出将是: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)