>我有一个时髦的脚本,如下所示:
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