【发布时间】:2020-06-14 18:12:54
【问题描述】:
我正在使用 Groovy v3.0.1。
我看到以下代码的响应出乎我的意料。我构建了一个动词、名词和闭包的映射。
我第一次使用methodReferencemybed::trySleep作为要传递的闭包,但是将delegate设置为数据对象,并使用DELEGATE_ONLY解析。
第二个入口通过一个直线闭包作为闭包。
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")
我在第一次查找时曾设想,当方法引用使用 {->name} 动态构建其 GString 时,该方法的委托已被我的数据对象覆盖,调用此方法会将数据对象上的名称解析为新的代表。
第二个条目是我的内联闭包,它按照您的预期解析委托数据对象上的名称。
它没有 - 它解析 myBed 实例上的名称。这是正确的行为吗?
输出是:
called instance.onSleep() for name (wills bed) with hi
called with william, and sees name as: first data object
【问题讨论】:
-
我在 Groovy 2.5.9 和
mybed.&trySleep而不是mybed::trySleep上看到了同样的事情,所以我认为这是正确的行为