MissingMethodException 同时调用 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 clouserXXX那里)。

如果您省略唯一的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

最新更新