Closure.delegate 不适用于包含 methodMissing 方法的对象?



我的测试代码如下:

#!/usr/bin/env groovy
class Inner {
    def methodMissing(String name, args) {
        println "inner:${name}"
    }
}
def foo = {
    bar()
}
foo.delegate = new Inner()
foo.call()

它给出的结果是:

inner:bar

如果我添加另一个方法缺少方法,如下所示:

#!/usr/bin/env groovy
class Inner {
    def methodMissing(String name, args) {
        println "inner:${name}"
    }
}
// This method is added
def methodMissing(String name, args) {
    println "outer:${name}"
}
def foo = {
    bar()
}
foo.delegate = new Inner()
foo.call()

它给出的结果是:

outer:bar

为什么?我将委托设置为闭包"foo"。为什么不是内在的。方法丢失调用?

从本文档中,我相信您会想要更改解决策略。我添加了一个foo2和一些断言来说明行为的对比:

class Inner {
    def methodMissing(String name, args) {
        println "inner:${name}"
        return "inner:${name}"
    }
}
def methodMissing(String name, args) {
    println "outer:${name}"
    return "outer:${name}"
}
def foo = { bar() }
foo.delegate = new Inner()
assert "outer:bar" == foo.call()
def foo2 = { bar() }
foo2.delegate = new Inner()
foo2.resolveStrategy = Closure.DELEGATE_FIRST
assert "inner:bar" == foo2.call()

最新更新