如果我有一个附加到扩展的闭包,并且闭包引用了扩展上的值,就像这样......
def e = new Expando()
e.val = 'hi'
e.doit = { println delegate.val }
e.doit()
它工作正常。并打印“嗨”
如果我用长格式调用闭包
e.doit.call()
它抛出一个错误
groovy.lang.MissingPropertyException: No such property: val for class: Script1
at Script1$_run_closure1.doCall(Script1.groovy:4)
at Script1$_run_closure1.doCall(Script1.groovy)
at Script1.run(Script1.groovy:6)
发生这种情况是因为委托从 e 更改为脚本。为什么?我认为 e.doit() 和 e.doit.call() 应该是相同的。
我可以手动更改委托 - 就像这样
def e = new Expando()
e.val = 'hi'
e.doit = { println delegate.val }
e.doit.delegate=e;
e.doit.call()
关于如何跳过代表的显式设置的任何想法?