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)()