首页 文章

创建全局Groovy闭包

提问于
浏览
1

我正在尝试学习如何在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

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


EDIT: (使用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 回答

  • 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

    import static Tools.header 应该做的伎俩 . 你't need a closure in this case as you call simple method. If you'必须在你的代码 a.groovyb.groovy 中的某个地方传递 header 仍然可以使用 &header .

相关问题