[英]Creating Global Groovy Closure
我正在嘗試學習如何在groovy中創建全局閉包(如println閉包)。 我有以下代碼:
雜種
def header = Tools.&header
header 'groovy script a'
常規
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
在每個我想使用Tools.header()的常規腳本中(並且在導入工具包時僅使用標頭閉包)。 我試圖將定義放到Tools類之后,但這沒有用。 能做到嗎? 有沒有更好的方法來解決這個問題?
編輯:(除非有更簡單的方法來包括外部腳本,否則請使用metaClass和評估方法):
雜種
evaluate(new File("Tools.groovy"))
header 'groovy script a'
常規
evaluate(new File("Tools.groovy"))
header 'groovy script b'
tools.groovy
Object.metaClass.header = {str ->
println("\n${str}")
println("-" * 80)
}
println
實際上不是全局閉包。 這是使用groovy元編程添加到java.lang.Object
方法。 因為所有類都擴展了Object
包括包裝在groovy控制台中運行的代碼的腳本類-所以println
可以在任何地方調用。
您可以將自己的方法添加到Object
。 在Groovy控制台中運行以下代碼以查看其運行情況:
// Add a global sayHello() method
Object.metaClass.sayHello = {-> println 'hello' }
// Try it out
sayHello()
import static Tools.header
應該可以解決問題。 在這種情況下,您在調用簡單方法時不需要關閉。 如果必須在header
a.groovy
或b.groovy
的某個地方傳遞header
作為閉包, a.groovy
仍可以使用&header
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.