为什么我会得到一个“a”;没有方法的签名“&引用;在GroovyShell中运行闭包递归示例时出错?
我正在尝试使用中的Groovy闭包递归示例 我将代码段保存在一个名为recursionTest.groovy的文件中,并将其加载到shell中,但得到了一个“无方法错误签名”:为什么我会得到一个“a”;没有方法的签名“&引用;在GroovyShell中运行闭包递归示例时出错?,groovy,recursion,closures,Groovy,Recursion,Closures,我正在尝试使用中的Groovy闭包递归示例 我将代码段保存在一个名为recursionTest.groovy的文件中,并将其加载到shell中,但得到了一个“无方法错误签名”: //recursionTest.groovy def结果=[]; {a,b-> 结果[] 错误groovy.lang.MissingMethodException: 方法java.lang.Boolean.call()的签名不适用于参数类型:(groovysh\u evaluate$\u run\u closure1)值
//recursionTest.groovy
def结果=[];
{a,b->
结果[]
错误groovy.lang.MissingMethodException:
方法java.lang.Boolean.call()的签名不适用于参数类型:(groovysh\u evaluate$\u run\u closure1)值:[groovysh\u evaluate$\u run_closure1@6b7599cc]
可能的解决方案:wait()、any()、wait(long)和(java.lang.Boolean)、each(groovy.lang.Closure)、any(groovy.lang.Closure)
在groovysh_evaluate.run(groovysh_evaluate:1)
...
groovy:003>
发生了什么事?我没有一个完美的答案给你,但在使用某些Groovy功能时,这似乎会把事情搞砸 您所拥有的示例代码在
groovyConsole
(这是一个图形编辑器,更易于使用)以及使用groovy recursionTest.groovy
运行它时都能完美地工作
我还没有找到一个在groovy shell中可以正常工作的解决方案,但无论如何,我并不推荐使用它进行学习。我认为您的脚本中存在两个问题:
def results
。然而,这并不是抛出的错误results=[];
f={a,b->
结果Groovy 1.7的教程有一个更新版本。我记得,我认为问题在于在Groovy shell中使用def
。解决方案是要么将def
语句移动到闭包的第一行,要么删除def
,然后只得到results=[]
,但我记不清了——已经有一段时间了。
// 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>
results = [];
f = { a, b ->
results << a
a<10 && call(b, a+b) }(1,1)
assert results == [1, 1, 2, 3, 5, 8, 13]