事实证明,我的一个可插入闭包需要在同一个文件中调用另一个闭包。
但是,在执行期间,从一个闭包到另一个闭包的调用失败,并出现此异常:
No signature of method: groovy.util.ConfigSlurper$_parse_closure5.criterion2() is applicable for argument types: (java.util.LinkedHashMap)
此错误不正确。实际上有一个关闭地图。我认为问题在于关闭的范围或资格。
name ="strategy1"
key ="strategy1"
criterion1 = { params ->
params.a > params.b
}
criterion2 = { params ->
params.a >= params.c && params.a >= params.d
}
constructWidget = { params ->
def base = [symbol:params.sym, price:params.pr, strategy:params.strat]
if( criterion2(base) ) { // this is where the exception occurs
// ...
}
}
从“插件”外部调用这些闭包工作正常。从constructWidget内部引用名为criterion2的闭包的正确方法是什么?
答案 0 :(得分:0)
在ConfigSlurper的帮助下加载插件时,您描述的问题具有良好的可重现性:
def plugin = new ConfigSlurper().parse( new File('plugin1.groovy').toURL() )
plugin.constructWidget([:])
使用GroovyShell而不是ConfigSlurper来解决问题:
Binding binding = new Binding()
GroovyShell shell = new GroovyShell(binding)
def plugin = shell.evaluate(new File('plugin1.groovy'))
plugin.constructWidget([:])
<强>更新-20140104:强>
如果你在循环中加载插件:
new File( grailsApplication.config.externalFiles ).eachFile { file ->
Binding binding = new Binding()
GroovyShell shell = new GroovyShell(binding)
shell.evaluate(file)
strategies.put( binding.variables.key, binding.variables )
}