Groovy调用字段

时间:2017-05-02 11:09:51

标签: groovy

我试图在字段中输入一个支持呼叫操作的对象,然后给他打电话。我可以在变量中没有中间读取字段的情况下完成吗? 我的尝试看起来像这样:

groovy.lang.MissingMethodException

但我收到huxtable

你能做什么?或者,任何人都可以提供一份证据,证明我们无法称之为该领域吗?

2 个答案:

答案 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)