【问题标题】:Groovy: add a method to a closureGroovy:向闭包添加方法
【发布时间】:2016-01-07 16:31:31
【问题描述】:

我有以下闭包

def closure = {
   println ("closure code")
}

我想给它添加一个方法。 但如果我尝试

 closure.metaClass.fun = { c->
        c.call();
        println ("extra code");
 }   

我得到一个异常

groovy.lang.MissingPropertyException: No such property: fun for class: org.codehaus.groovy.runtime.metaclass.ClosureMetaClass

看了另一个答案,我也盲目尝试打电话

ExpandoMetaClass.enableGlobally()

但它不起作用。

有没有办法实现我想要的?

【问题讨论】:

    标签: groovy closures metaprogramming


    【解决方案1】:

    你可以这样做:

    def closure = {
        println "closure code"
    }
    
    closure.getMetaClass().fun = { ->
        delegate.call()
        println "extra code"
    }   
    
    closure.fun()
    

    哪些打印:

    closure code
    extra code
    

    【讨论】:

      【解决方案2】:

      另一种更简单的方法可能是:

      def closure = {    
          println "closure code" 
      }  
      
      closure.fun = { ->  
          closure()
          println "extra code" 
      }     
      
      closure.fun()
      

      这种方法的缺点是我直接引用闭包变量,而不是通过委托。

      【讨论】:

        猜你喜欢
        • 2012-04-25
        • 2010-11-30
        • 2015-11-27
        • 1970-01-01
        • 1970-01-01
        • 2011-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多