2011-04-06 80 views
1

我想了解如何在groovy中創建全局閉包(如println閉包)。我有以下代碼:創建全局Groovy Closure

a.groovy

def header = Tools.&header 
header 'groovy script a' 

b.groovy

def header = Tools.&header 
header 'groovy script b' 

tools.groovy

class Tools { 
    def static header(String str) { 
     println("\n${str}") 
     println("-" * 80) 
    } 
} 

我想避免:

def header = Tools.&header 
在每一個Groovy腳本,我想用Tools.header(

)(,只使用頭閉合,當我導入工具包)。我試圖把這個定義放在Tools類後面,但那不起作用。這可以做到嗎?有沒有更好的方法來處理這個問題?


編輯:(使用元類和方法評估,除非有以包括外部腳本更簡單的方式):

a.groovy

evaluate(new File("Tools.groovy")) 
header 'groovy script a' 

b .groovy

evaluate(new File("Tools.groovy")) 
header 'groovy script b' 

tools.groovy

Object.metaClass.header = {str -> 
    println("\n${str}") 
    println("-" * 80) 
} 

回答

7

println實際上並不是全局封閉。這是一種使用groovy元編程添加到java.lang.Object的方法。因爲所有類都擴展爲Object - 包括在Groovy控制檯中運行代碼的腳本類 - 可以從任何地方調用println

您可以將您自己的方法添加到Object。在Groovy控制檯中運行此代碼以查看它的行動:

// Add a global sayHello() method 
Object.metaClass.sayHello = {-> println 'hello' } 

// Try it out 
sayHello() 
+0

謝謝,這有幫助。我確實需要在腳本中添加如下內容:'evaluate(new File(「../ tools/Tools.groovy」))'將object.metaClass定義從一個外部腳本文件包含到其他腳本中。這是一種僞「包含」(可能不是正確的術語,但它在概念上看起來像我) – jmq 2011-04-06 16:39:39

0

import static Tools.header應該做的伎倆。在您調用簡單方法時,您不需要關閉此例。如果您必須通過header作爲代碼a.groovyb.groovy中某處的關閉,則仍然可以使用&header