“麻烦”;压倒一切;带有.delegate的Groovy闭包中的值
我想使用委托参数调用闭包,以覆盖或隐藏调用上下文。但下面的示例打印的是我期望的“内部”的“外部” 我做错了什么?“麻烦”;压倒一切;带有.delegate的Groovy闭包中的值,groovy,delegates,closures,Groovy,Delegates,Closures,我想使用委托参数调用闭包,以覆盖或隐藏调用上下文。但下面的示例打印的是我期望的“内部”的“外部” 我做错了什么? 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") 我认为问题在于,当在函
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
定义移到函数f
之外,则它会工作:
v = { return a }
def f(String a){
v.delegate = [a:"inside"]
println(v.call())
}
f("outside")
我认为问题在于,当在函数中声明闭包时,它会“关闭”方法中的已知值(
a
),因此该值会被有效地硬编码到闭包中(它不会命中委托以查找闭包已知的未知值)
如果将闭包v
定义移到函数f
之外,则它会工作:
v = { return a }
def f(String a){
v.delegate = [a:"inside"]
println(v.call())
}
f("outside")
另一个选项是使用
getProperty('a')
,而不是直接使用a
,因为这会强制使用委托来检索a的值。另一个选项是使用getProperty('a'))
而不是直接使用a
,因为这会强制使用委托来检索a
的值,也可以通过在闭包中引用委托来完成。对于作为闭包的v
,a
没有任何意义(相当于使用ExpandoMetaClass)
也可以通过引用闭包中的委托
来完成。对于作为闭包的v
,a
没有任何意义(相当于使用ExpandoMetaClass)