我正在尝试学习如何在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 回答
println
实际上并不是全局闭包 . 这是一个使用groovy元编程添加到java.lang.Object
的方法 . 因为所有类都扩展Object
- 包括包装在groovy控制台中运行的代码的脚本类 - 可以从任何地方调用println
.您可以将自己的方法添加到
Object
. 在Groovy控制台中运行此代码以查看它的运行情况:import static Tools.header
应该做的伎俩 . 你't need a closure in this case as you call simple method. If you'必须在你的代码a.groovy
或b.groovy
中的某个地方传递header
仍然可以使用&header
.