我正在学习Groovy,并且遇到了这种奇怪的行为。在groovysh
中执行以下代码可以顺利运行,但将其另存为“foo.groovy”并通过groovy foo.groovy
运行会在第3行中生成MissingPropertyException: No such property: a for class: foo
:
def a(n) { n*n }
def x(m) { m(2) }
x(a)
将a
更改为闭包a = { n -> n*n }
会使此错误消失,但我想避免使用更复杂的实际用例。我还发现this question处理类中的同样问题,但使用this.&
的解决方案不适用,因为我的方法不在类,来自python背景,我想保持这种方式。
我做错了什么?这种行为记录在哪里?
答案 0 :(得分:1)
看起来像groovysh
商店:
def a(n) { n*n }
作为MethodClosure进入名为a
这不会发生在groovysh之外,正如你所看到的,你需要将a定义为闭包:
def a = { n -> n*n }
def x( m ) { m( 2 ) }
x(a)
或使用方法引用运算符&
:
def a(n) { n*n }
def x(m) { m(2) }
x( this.&a )