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

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 に答える