鉴于这个Groovy程序:
def f(x) { return x }
g = f
println g(42)
将程序提供给Groovy(版本2.4.12)解释程序时,会打印一条错误消息:
groovy.lang.MissingPropertyException:没有这样的属性:f表示类:x 在x.run(x.groovy:3)
但是,将程序更改为
def f = { x -> x }
g = f
println g(42)
使解释器按预期打印'42'。
为什么这两个f
定义的处理方式不同?有没有办法调整g
的定义,以便前一版本运行(可能使用&.
运算符)?
答案 0 :(得分:5)
使用:
def f(x) { return x }
您定义的方法不是对象,而是:
def f = { x -> x }
你定义一个闭包,它是一个groovy的对象。
这些不是等同的生物。见here。
您确实可以使用&
运算符(在中将方法转换为闭包):
def f(x) { return x }
def g = this.&f
println g(42)