为什么我会得到一个“a”;没有方法的签名“&引用;在GroovyShell中运行闭包递归示例时出错?

为什么我会得到一个“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)值

我正在尝试使用中的Groovy闭包递归示例

我将代码段保存在一个名为recursionTest.groovy的文件中,并将其加载到shell中,但得到了一个“无方法错误签名”:

//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中可以正常工作的解决方案,但无论如何,我并不推荐使用它进行学习。

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

  • 在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]