代码之家  ›  专栏  ›  技术社区  ›  Bosh

在使用.delete的Groovy闭包中“重写”值的问题

  •  2
  • Bosh  · 技术社区  · 12 年前

    我想调用一个带有委托参数的闭包来覆盖或隐藏调用上下文。但下面的例子打印的是我期望的“内部”的“外部”。

    我做错了什么?

    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 回复  |  直到 12 年前
        1
  •  2
  •   tim_yates    12 年前

    我认为问题在于,当在函数内部声明闭包时,它会在方法中的已知值周围“闭合”( a ),这样该值就可以有效地硬编码到闭包中(它永远不会碰到委托来查找闭包已知的未知值)。

    如果你移动封口 v 函数外的定义 f ,那么它就起作用了:

    v = { return a }
    
    def f(String a){
      v.delegate = [a:"inside"]
      println(v.call())
    }
    
    f("outside")
    
        2
  •  1
  •   Alfergon    12 年前

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

        3
  •  1
  •   dmahapatro    12 年前

    也可以通过参考 delegate 在闭合中。对于 v 作为闭合件, a 没有任何意义(相当于使用ExpandoMetaClass)

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