我正在尝试学习如何在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)
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)
| 归档时间: |
|
| 查看次数: |
2133 次 |
| 最近记录: |