Groovy 方法和属性之间的嵌套闭包解析不同?
当闭包的resolveStrategy设置为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 =
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使用重新水合
新家: