使用.delegate解决Groovy闭包中的“覆盖”值问题

时间:2013-08-27 15:24:17

标签: 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")

3 个答案:

答案 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")