【问题标题】:Groovy v3 method reference and groovyString dynamic variable resolution priority if you explicitly set the MethodClosure delegate如果显式设置 MethodClosure 委托,则 Groovy v3 方法引用和 groovyString 动态变量解析优先级
【发布时间】: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.&amp;trySleep 而不是 mybed::trySleep 上看到了同样的事情,所以我认为这是正确的行为

标签: groovy method-reference


【解决方案1】:

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

(来自this post on the mailing list

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

【讨论】:

    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    相关资源
    最近更新 更多