创建全局Groovy闭包

时间:2011-04-06 03:54:10

标签: groovy closures

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

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

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


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

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

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

import static Tools.header应该做到这一点。在这种情况下,调用简单方法时不需要闭包。如果您必须在headera.groovy的代码中将b.groovy作为封闭传递,则仍然可以使用&header