嵌套闭包分辨率在方法和属性之间是否不同? [英] Nested closure resolution different between methods and properties?
本文介绍了嵌套闭包分辨率在方法和属性之间是否不同?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
当闭包的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屋!
查看全文