在闭包内部调用Groovy闭包时MissingMethodException
我有一个groovy脚本,如下所示:在闭包内部调用Groovy闭包时MissingMethodException,groovy,Groovy,我有一个groovy脚本,如下所示: def clouser = { def clouserOne = { _argsA -> def clouserTwo = { _argsB -> // Do Something with _argsA and _argsB println(_argsA) println(_argsB) } } } 打电话的时候 clo
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
。我不确定您为什么将原来的封闭式问题更改为完全不同的问题。你从现在开始投票,从一个似乎合理的问题结束。编辑的问题是我这边的一个错误,没有太多的解释。哦,我明白了。它实际上是相关的-它只是如此罕见,以至于一个封闭的问题能够正确地转过来。所以它应该很快重新开放…太棒了!这是实现期望的一种方法。