Groovy Can';Don’不要把一个闭包换成另一个闭包

Groovy Can';Don’不要把一个闭包换成另一个闭包,groovy,Groovy,我正在基于实现一个可插拔的体系结构 事实证明,我的一个可插入闭包需要调用同一文件中的另一个闭包 但是,在执行过程中,从一个闭包到另一个闭包的调用失败,出现以下异常: No signature of method: groovy.util.ConfigSlurper$_parse_closure5.criterion2() is applicable for argument types: (java.util.LinkedHashMap) 这个错误不是真的。实际上,有一个闭包需要一张地图。我认

我正在基于实现一个可插拔的体系结构

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

但是,在执行过程中,从一个闭包到另一个闭包的调用失败,出现以下异常:

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内部引用名为Criterio2的闭包的正确方法是什么?

在ConfigSlurper的帮助下加载插件时,您描述的问题是可重复的:

def plugin = new ConfigSlurper().parse( new File('plugin1.groovy').toURL() )
plugin.constructWidget([:])
Binding binding = new Binding()
GroovyShell shell = new GroovyShell(binding)
def plugin = shell.evaluate(new File('plugin1.groovy'))
plugin.constructWidget([:])
使用GroovyShell而不是ConfigSlurper可以解决此问题:

def plugin = new ConfigSlurper().parse( new File('plugin1.groovy').toURL() )
plugin.constructWidget([:])
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 )
}

您使用的Groovy版本是什么?请尝试调用owner.criterion2(base),而不仅仅是criterion2(base)owner.criterion2()不起作用。将def添加到闭包中起作用。然而,我发现额外的一行(criterion2=criterion2_)实际上阻止了它的工作,这是非常奇怪的。因此,简单地向闭包中添加def就是全部解决方案。我认为,这样做的缺点是,在可插入文件之外无法访问带有def的闭包。你知道为什么吗?你正在用ConfigSlurper加载你的插件吗?你所描述的问题在ConfigSlurper中是可以重现的,一旦ConfigSlurper被GroovyShell替换,这个问题就会消失。不需要特别调整脚本。我将更新上面的解决方案。我在循环中调用ConfigSlurper.parse(),我不确定如何转换为GroovyShell`新建文件(grailsApplication.config.externalFiles).eachFile{File->def config=new-ConfigSlurper().parse(File.toURL())strategies.put(config.key,config)`我有一个关于从这些脚本登录的后续问题。感谢您的帮助!