不能从另一个调用一个闭包

时间:2013-12-23 17:43:08

标签: groovy

我正在实施基于http://fbflex.wordpress.com/2010/03/14/hot-pluggable-extensions-in-grails-adding-and-changing-your-application-behaviour-on-the-fly/的可插拔架构。

事实证明,我的一个可插入闭包需要在同一个文件中调用另一个闭包。

但是,在执行期间,从一个闭包到另一个闭包的调用失败,并出现此异常:

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的闭包的正确方法是什么?

1 个答案:

答案 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 )
}