嵌套闭包分辨率在方法和属性之间是否不同? [英] Nested closure resolution different between methods and properties?

查看:61
本文介绍了嵌套闭包分辨率在方法和属性之间是否不同?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当闭包的resolveStrategy设置为 DELEGATE_ONLY DELEGATE_FIRST 时,嵌套闭包中方法和属性之间的分辨率不同代表。例如,在下面的示例中, x 解析为 f 的委托(我所期望的),但 keySet()解析为 g 的委托。

When a closure's resolveStrategy is set to DELEGATE_ONLY or DELEGATE_FIRST, resolution is different in nested closures between methods and properties of the delegate. For example, in the following, x resolves to f's delegate (what I expect), but keySet() resolves to g's delegate.

​def g = {->
    def f = {
        {-> [x, keySet()]}()
    }

    f.resolveStrategy = Closure.DELEGATE_ONLY
    f.delegate = [x: 1, f: 0]

    f()
}      

g.delegate = [x: 0, g: 0]
g()


结果: [1,['x','g']]

无嵌套闭包

def g = {->
    def f = {
        [x, keySet()]
    }

    f.resolveStrategy = Closure.DELEGATE_ONLY
    f.delegate = [x: 1, f: 0]

    f()
}      

g.delegate = [x: 0, g: 0]
g()

结果: [1,['x','f']]

此行为是否在预期中并记录在某处?

Is this behavior expected and documented somewhere? Is it a bug?

推荐答案

我相信这是一个错误。如果更改 Expando 的地图,其行为将有所不同:

I believe it is a bug. If you change the map for a Expando it behaviors differently:

f = {
  g = {
    { -> keySet() }()
  }

  g.delegate = new Expando(a: 1000, b: 900, c: 800, keySet: { 'g keyset' })
  g.resolveStrategy = Closure.DELEGATE_ONLY
  g()

}

f.delegate = new Expando(a: 90, x: 9, y: 1, keySet: { 'f keyset' })

assert f() == 'g keyset'




f = {
  g = {
    { -> keySet() }()
  }

  g.delegate = [a: 1000, b: 900, c: 800]
  g.resolveStrategy = Closure.DELEGATE_ONLY
  g()

}

f.delegate = [a: 90, x: 9, y: 1]

assert f().toList() == ['a', 'b', 'c'] // fails :-(

也许填写 JIRA

这篇关于嵌套闭包分辨率在方法和属性之间是否不同?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆