【问题标题】:Understanding groovy closures了解 groovy 闭包
【发布时间】:2018-11-05 12:01:22
【问题描述】:

我试图了解 Groovy 的闭包是如何在下面的代码中完成的,

foo {
    a=10
    b=20
}

def foo(Closure closure) {
    def params = [:]

    closure.resolveStrategy = Closure.DELEGATE_FIRST
    closure.delegate = params

    closure()

    println params.a
    println params.b
}

在foo的实现中,从来没有给params赋值,那么params怎么会得到a&b的值

我读过关于 Groovy 闭包的文章,但不知道它是如何工作的???

【问题讨论】:

    标签: groovy closures


    【解决方案1】:

    以下行定义了闭包DELEGATE_FIRST 的属性和方法解析策略。这意味着要获取/设置/调用任何属性/方法,它将首先转到delegate 对象,当没有这样的属性/方法时,它将转到owner 对象。

    closure.resolveStrategy = Closure.DELEGATE_FIRST
    

    下一行将闭包的delegate对象设置为params

    closure.delegate = params
    

    最后你的闭包只设置了两个属性。以及在delegate 对象上设置的那些属性(此时为param

    {
        a=10
        b=20
    }
    

    【讨论】:

    • DELEGATE_FIRST 是否也为委托设置了属性?我知道获取财产,但现在也知道设置财产?这不是副作用吗?解析策略 DELEGATE_FIRST 意味着它将首先尝试从 DELEGATE 解析属性,然后是所有者。
    • @Aditya,我添加了详细信息来回答。是的,在 DELEGATE_FIRST 的情况下,get/set/call 将首先转到委托对象,然后再转到所有者。这不是副作用 - 全部根据documentation
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 2022-09-24
    • 2015-07-26
    • 1970-01-01
    相关资源
    最近更新 更多