“麻烦”;压倒一切;带有.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)