创建全局Groovy闭包

jmq*_*jmq 1 groovy closures

我正在尝试学习如何在groovy中创建一个全局闭包(比如println闭包).我有以下代码:

a.groovy

def header = Tools.&header
header 'groovy script a'
Run Code Online (Sandbox Code Playgroud)

b.groovy

def header = Tools.&header
header 'groovy script b'
Run Code Online (Sandbox Code Playgroud)

tools.groovy

class Tools {
    def static header(String str) {
        println("\n${str}")
        println("-" * 80)
    }
}
Run Code Online (Sandbox Code Playgroud)

我想避免:

def header = Tools.&header
Run Code Online (Sandbox Code Playgroud)

在每个groovy脚本中,我想使用Tools.header()(并在导入工具包时使用标头闭包).我尝试将该定义放在Tools类之后,但这不起作用.可以这样做吗?有没有更好的方法来处理这个?


编辑:(使用metaClass和evaluate方法除非有更简单的方法来包含外部脚本):

a.groovy

evaluate(new File("Tools.groovy"))
header 'groovy script a'
Run Code Online (Sandbox Code Playgroud)

b.groovy

evaluate(new File("Tools.groovy"))
header 'groovy script b'
Run Code Online (Sandbox Code Playgroud)

tools.groovy

Object.metaClass.header = {str ->
    println("\n${str}")
    println("-" * 80)
}
Run Code Online (Sandbox Code Playgroud)

Dón*_*nal 7

println实际上并不是全球性的关闭.这是一种添加到java.lang.Object使用groovy元编程的方法.因为所有类都扩展Object- 包括包装在groovy控制台中运行的代码的脚本类 - println可以从任何地方调用.

您可以添加自己的方法Object.在Groovy控制台中运行此代码以查看它的运行情况:

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

// Try it out
sayHello()
Run Code Online (Sandbox Code Playgroud)