簡體   English   中英

創建全局Groovy閉包

[英]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.groovyb.groovy的某個地方傳遞header作為閉包, a.groovy仍可以使用&header

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM