在闭包内部调用Groovy闭包时MissingMethodException

在闭包内部调用Groovy闭包时MissingMethodException,groovy,Groovy,我有一个groovy脚本,如下所示: def clouser = { def clouserOne = { _argsA -> def clouserTwo = { _argsB -> // Do Something with _argsA and _argsB println(_argsA) println(_argsB) } } } 打电话的时候 clo

我有一个groovy脚本,如下所示:

def clouser = {
    def clouserOne = { _argsA  -> 
        def clouserTwo = { _argsB ->
            // Do Something with _argsA and _argsB
            println(_argsA)
            println(_argsB)
        }
    }
} 
打电话的时候

clouser().clouserOne("A").clouserTwo("B")
我犯了一个错误

groovy.lang.MissingMethodException: No signature of method: Script1.clouserOne() is applicable for argument types: (String) values: [A]
    at Script1.run(Script1.groovy:11)

在闭包中定义这种闭包的正确方法是什么?如何以正确的方式调用它?

原始代码的问题是,您只定义了一些 永远不会被使用的局部变量。相反,指定的闭包是 直接返回

要使原始代码正常工作,可以调用:

closure()("A")("B")
(每个闭包调用返回下一个闭包,您只需将 调用;当然,不需要在 那里)

如果只保留
def
,则将创建“全局变量”,即 很可能不是你想要的

如果你想把名字放在里面,你必须返回一些东西 有名字的。一个简单的例子是使用映射作为返回。例如:

def closure = { ->
    [closureOne: { _argsA  -> 
        [closureTwo: { _argsB ->
            println(_argsA)
            println(_argsB)
        }]
    }]
} 

closure().closureOne("A").closureTwo("B")

在进一步阅读之后,我遇到了更复杂的闭包闭包,它将接受闭包并在闭包内执行。 例如:

someClouser = {_args -> _args }

clouser = {
    clouserOne = { String _argOne -> 
        clouserTwo = { String _argTwo, Closure c={any()} -> 
            print "Use _argOne: ${_argOne} and _argTwo : ${_argTwo} and invoke passed clouser ${c.call()} this way" 
        }
    } 
}.call()
它可以是呼叫或使用,就像

clouser.clouserOne("IMAGE").clouserTwo("INSIDE") ​{ 
     someClouser "Hello World" 
}​​​
结果将是

Use _argOne: IMAGE and _argTwo : INSIDE and invoke passed clouser Hello World this way

好!我想我找到了答案。您不需要在内部Clouser中指定
def
。我不确定您为什么将原来的封闭式问题更改为完全不同的问题。你从现在开始投票,从一个似乎合理的问题结束。编辑的问题是我这边的一个错误,没有太多的解释。哦,我明白了。它实际上是相关的-它只是如此罕见,以至于一个封闭的问题能够正确地转过来。所以它应该很快重新开放…太棒了!这是实现期望的一种方法。