我已获得以下代码:
trait ContainingClosure {
def method() {
def delegateClass = new DelegateClass()
def closure = {
methodFromDelegate()
}
closure.delegate = delegateClass
closure.resolveStrategy = Closure.DELEGATE_FIRST
closure.call()
}
}
class DelegateClass {
def methodFromDelegate() {
println 'methodFromDelegate called'
}
}
class Main implements ContainingClosure {}
new Main().method()
问题是,当我运行methodFromDelegate()
方法时,找不到call()
并抛出以下异常:
groovy.lang.MissingMethodException: No signature of method: Main.methodFromDelegate() is applicable for argument types: () values: []
有没有合理的解释为什么这个代码段在Grails 2.5.0(Groovy 2.4.3)中不起作用?看起来闭包的委托被忽略了,方法查找在Main类范围内完成而不是委托本身。
将trait
更改为class
并将特征实现为继承会使此代码再次运行。
答案 0 :(得分:1)
发现它,这是这个错误
https://issues.apache.org/jira/browse/GROOVY-7456
这是在groovy 2.4.4中修复的,所以grails的升级应该修复它:-)