2016-01-07 59 views
0

我有以下的封閉Groovy的:添加一個方法來封閉

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

,但它不工作。

有沒有辦法實現我想要的?

回答

6

你可以這樣做:

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

這種方法的缺點是,我引用直接關閉變量,而不是通過委託。