2

我想用委托参数调用闭包来覆盖或隐藏调用上下文。但是下面的示例在我期望“内部”的地方打印“外部”。

我究竟做错了什么?

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")
4

3 回答 3

2

我认为问题在于,当在函数内部声明闭包时,它会“关闭”方法a(闭包已知的值)。

如果将闭包v定义移到 function 之外f,那么它可以工作:

v = { return a }

def f(String a){
  v.delegate = [a:"inside"]
  println(v.call())
}

f("outside")
于 2013-08-27T15:41:13.287 回答
1

其他选项是使用getProperty('a')而不是直接使用a,因为这会强制使用委托来检索a.

于 2013-08-27T15:48:17.327 回答
1

也可以通过引用delegate闭包中的来完成。对于v作为闭包,a没有任何意义(相当于使用ExpandoMetaClass)

def f(String a){
  def v = { delegate.a }
  v.delegate = [a:"inside"]

  println v()
}

f("outside")
于 2013-08-27T16:38:31.697 回答