我正在尝试学习如何在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)
}
答案 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
应该做到这一点。在这种情况下,调用简单方法时不需要闭包。如果您必须在header
或a.groovy
的代码中将b.groovy
作为封闭传递,则仍然可以使用&header
。