如果显式设置MethodClosure委托,则Groovy v3方法引用和groovyString动态变量解析优先级
我正在使用Groovy v3.0.1 我看到了一个我没有预料到的来自以下代码的响应。我构建了动词、名词和闭包的地图 我第一次使用methodReference如果显式设置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 () {
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