我正在尝试使用http://groovy.codehaus.org/JN2515-Closures中的Groovy闭包递归示例。
我将代码段保存在一个名为recursionTest.groovy的文件中并将其加载到shell中,但是我收到了“没有方法错误签名”:
// recursionTest.groovy
def results = [];
{ a, b ->
results << a
a<10 && call(b, a+b)
}(1,1)
assert results == [1, 1, 2, 3, 5, 8, 13]
groovy:000> load recursionTest.groovy
===> []
ERROR groovy.lang.MissingMethodException:
No signature of method: java.lang.Boolean.call() is applicable for argument types: (groovysh_evaluate$_run_closure1) values: [groovysh_evaluate$_run_closure1@6b7599cc]
Possible solutions: wait(), any(), wait(long), and(java.lang.Boolean), each(groovy.lang.Closure), any(groovy.lang.Closure)
at groovysh_evaluate.run (groovysh_evaluate:1)
...
groovy:003>
发生了什么事?
答案 0 :(得分:2)
我没有一个完美的答案,但看起来GroovySH has some hacks可能会在使用某些Groovy功能时搞砸了。
您在groovyConsole
(这是一个图形编辑器,更易于使用)中运行的示例代码完美无缺,并且使用groovy recursionTest.groovy
运行它。
我还没有找到一个在groovy shell中正常工作的解决方案,但无论如何我都不会建议使用它进行学习。
答案 1 :(得分:1)
我认为您的脚本存在两个问题:
在shell环境中,您有一定的范围。绑定的变量位于&#34;绑定&#34;中。要获得绑定中的一个,您必须在使用它之前确保它未定义!所以没有def results
。然而,这不是错误。
可以通过命名闭包递归来修复 强制转换的错误。结合不定义结果产生:
-
results = [];
f = { a, b ->
results << a
a<10 && call(b, a+b) }(1,1)
assert results == [1, 1, 2, 3, 5, 8, 13]