我想用委托参数调用闭包来覆盖或隐藏调用上下文。但是下面的示例在我期望“内部”的地方打印“外部”。
我究竟做错了什么?
def f(String a){
def v = { return a }
v.delegate = [a:"inside"]
// Makes no difference:
// v.resolveStrategy = Closure.DELEGATE_FIRST
println(v.call())
}
f("outside")
我认为问题在于,当在函数内部声明闭包时,它会“关闭”方法a
(闭包已知的值)。
如果将闭包v
定义移到 function 之外f
,那么它可以工作:
v = { return a }
def f(String a){
v.delegate = [a:"inside"]
println(v.call())
}
f("outside")
其他选项是使用getProperty('a')
而不是直接使用a
,因为这会强制使用委托来检索a
.
也可以通过引用delegate
闭包中的来完成。对于v
作为闭包,a
没有任何意义(相当于使用ExpandoMetaClass)
def f(String a){
def v = { delegate.a }
v.delegate = [a:"inside"]
println v()
}
f("outside")