2014-12-23 29 views
3

当闭包的resolveStrategy设置为DELEGATE_ONLYDELEGATE_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']]

这种行为预期和地方记录?这是一个错误吗?

回答

0

我相信这是一个错误。如果更改地图的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 :-(

也许填充JIRA

+0

Jira创建:https://jira.codehaus.org/browse/GROOVY-7232 – Matthew

+0

Jira的新家:https://issues.apache.org/jira/browse/GROOVY-7232 – Matthew

0

我发现了一个解决办法,如果你从来没有想通过下降到所有者(即DELEGATE_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不起作用:虽然没有错误,但它似乎是无操作的。您必须使用rehydrate