如果显式设置MethodClosure委托,则Groovy v3方法引用和groovyString动态变量解析优先级

如果显式设置MethodClosure委托,则Groovy v3方法引用和groovyString动态变量解析优先级,groovy,method-reference,Groovy,Method Reference,我正在使用Groovy v3.0.1 我看到了一个我没有预料到的来自以下代码的响应。我构建了动词、名词和闭包的地图 我第一次使用methodReferencemybed::trySleep作为要传递的闭包,但将委托设置为数据对象,并仅使用委托解析 第二个入口通过直线闭合作为闭合 package playpen class Bed { String name String bedSize = "5ft by 6ft" static sTrySleep () {

我正在使用Groovy v3.0.1

我看到了一个我没有预料到的来自以下代码的响应。我构建了动词、名词和闭包的地图

我第一次使用methodReference
mybed::trySleep
作为要传递的闭包,但将委托设置为数据对象,并仅使用委托解析

第二个入口通过直线闭合作为闭合

package playpen

class Bed {
    String name
    String bedSize = "5ft by 6ft"

    static sTrySleep () {
        println "called static on sleep"
    }

    void trySleep (arg = null) {
        println "called instance.onSleep() for name (${->name}) with " + arg ?: "<no arg>"
    }


}

Bed mybed = new Bed(name:"wills bed")

class DataObject {
    String name = "first data object"
    int height = 10
    int length = 12
    int width = 5
}

Map verbNounLookup = new HashMap()

Map buildAction (Map vnl, String verb, String noun, data, Closure method) {
    method.delegate = data
    method.resolveStrategy = Closure.DELEGATE_ONLY
    def lookup = [(verb): [(noun): method]]
    vnl.putAll(lookup)
    lookup
}

buildAction (verbNounLookup, "go", "snooze", new DataObject(), mybed::trySleep)
buildAction (verbNounLookup, "do", "thing", new DataObject(), {println "called with $it, and sees name as: $name"})

def action = verbNounLookup.go.'snooze'

action ("hi")

action = verbNounLookup.do.thing
action( "william")

MethodClosures不使用委托,它们是指向方法的指针,直接调用方法

(来自)

MethodClosure就像一个指向给定对象的一组方法的“指针” 给定实例的名称。该代表不在会议中扮演任何角色 这即使它会,一旦你进入这个方法,正常的规则 这种方法适用。这意味着方法解析过程是 由中定义方法的类的元类完成


我在Groovy 2.5.9和mybed上看到了同样的情况。
mybed&trySleep
而不是
mybed::trySleep
,因此我认为这是正确的行为
called instance.onSleep() for name (wills bed) with hi 
called with william, and sees name as: first data object