【问题标题】:Trouble "overriding" values in a Groovy closure with .delegate使用 .delegate 无法在 Groovy 闭包中“覆盖”值
【发布时间】:2013-08-27 15:24:17
【问题描述】:

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

我做错了什么?

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

【问题讨论】:

    标签: groovy delegates closures


    【解决方案1】:

    我认为问题在于,当在函数内部声明闭包时,它会“关闭”方法中的已知值 (a),因此该值会有效地硬编码到闭包中(它永远不会命中委托来查找闭包已知的未知值)。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2010-12-28
          • 2018-02-17
          • 1970-01-01
          • 2015-04-30
          • 2017-10-30
          • 2018-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多