为什么我在Groovy shell中运行闭包递归示例时遇到“No signature of method”“错误?

时间:2011-08-18 01:52:02

标签: groovy recursion closures

我正在尝试使用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> 

发生了什么事?

2 个答案:

答案 0 :(得分:2)

我没有一个完美的答案,但看起来GroovySH has some hacks可能会在使用某些Groovy功能时搞砸了。

您在groovyConsole(这是一个图形编辑器,更易于使用)中运行的示例代码完美无缺,并且使用groovy recursionTest.groovy运行它。

我还没有找到一个在groovy shell中正常工作的解决方案,但无论如何我都不会建议使用它进行学习。

答案 1 :(得分:1)

我认为您的脚本存在两个问题:

  1. 在shell环境中,您有一定的范围。绑定的变量位于&#34;绑定&#34;中。要获得绑定中的一个,您必须在使用它之前确保它未定义!所以没有def results。然而,这不是错误。

  2. 可以通过命名闭包递归来修复 强制转换的错误。结合不定义结果产生:

  3. -

    results = []; 
    
    f = { a, b ->   
    results << a   
    a<10 && call(b, a+b) }(1,1)
    
    assert results == [1, 1, 2, 3, 5, 8, 13]