Groovy 方法和属性之间的嵌套闭包解析不同?

Groovy 方法和属性之间的嵌套闭包解析不同?,groovy,closures,Groovy,Closures,当闭包的resolveStrategy设置为DELEGATE_ONLY或DELEGATE_FIRST时,嵌套闭包中委托的方法和属性之间的解析不同。例如,在下面的示例中,x解析为f的委托(我所期望的),但是keySet()解析为g的委托 ​def g = {-> def f = { {-> [x, keySet()]}() } f.resolveStrategy = Closure.DELEGATE_ONLY f.delegate =

当闭包的resolveStrategy设置为
DELEGATE_ONLY
DELEGATE_FIRST
时,嵌套闭包中委托的方法和属性之间的解析不同。例如,在下面的示例中,
x
解析为
f
的委托(我所期望的),但是
keySet()
解析为
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','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']]


这种行为是否在某个地方被期望和记录?它是一个bug吗?

我相信它是一个bug。如果更改
Expando
的映射,则其行为会有所不同:

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 :-(

也许填写?

如果您永远不想与所有者发生冲突(即,
DELEGATE\u ONLY
),我发现了一个解决方法:您可以将委托和所有者设置为相同的值:

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

    def d = [x: 1, f: 0]
    f = f.rehydrate(d, d, f.thisObject)

    f()
}      

g.delegate = [x: 0, g: 0]
g()
结果:
[1,[“x”,“f”]]

请注意,
f.owner=d
不起作用:虽然没有错误,但似乎不起作用。您必须为Jira使用
重新水合

新家: