我想用一个委托参数调用一个闭包来覆盖或遮蔽调用上下文。但是下面的例子打印出“我想要”内部“的”外部“。
我做错了什么?
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")
答案 0 :(得分:2)
我认为问题在于,当函数内部声明闭包时,它会“关闭”方法中的已知值(a
),以便该值有效地硬编码到闭包中(它永远不会让代表找到未知值,因为Closure已知它。
如果将闭包v
定义移到函数f
之外,那么它可以工作:
v = { return a }
def f(String a){
v.delegate = [a:"inside"]
println(v.call())
}
f("outside")
答案 1 :(得分:1)
其他选项是使用getProperty('a')
而不是直接使用a
,因为这会强制使用委托来检索a
的值。
答案 2 :(得分:1)
也可以通过引用闭包中的delegate
来完成。对于v
作为闭包,a
没有任何意义(相当于使用ExpandoMetaClass)
def f(String a){
def v = { delegate.a }
v.delegate = [a:"inside"]
println v()
}
f("outside")