[英]Creating Global Groovy Closure
我正在尝试学习如何在groovy中创建全局闭包(如println闭包)。 我有以下代码:
杂种
def header = Tools.&header
header 'groovy script a'
常规
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()的常规脚本中(并且在导入工具包时仅使用标头闭包)。 我试图将定义放到Tools类之后,但这没有用。 能做到吗? 有没有更好的方法来解决这个问题?
编辑:(除非有更简单的方法来包括外部脚本,否则请使用metaClass和评估方法):
杂种
evaluate(new File("Tools.groovy"))
header 'groovy script a'
常规
evaluate(new File("Tools.groovy"))
header 'groovy script b'
tools.groovy
Object.metaClass.header = {str ->
println("\n${str}")
println("-" * 80)
}
println
实际上不是全局闭包。 这是使用groovy元编程添加到java.lang.Object
方法。 因为所有类都扩展了Object
包括包装在groovy控制台中运行的代码的脚本类-所以println
可以在任何地方调用。
您可以将自己的方法添加到Object
。 在Groovy控制台中运行以下代码以查看其运行情况:
// Add a global sayHello() method
Object.metaClass.sayHello = {-> println 'hello' }
// Try it out
sayHello()
import static Tools.header
应该可以解决问题。 在这种情况下,您在调用简单方法时不需要关闭。 如果必须在header
a.groovy
或b.groovy
的某个地方传递header
作为闭包, a.groovy
仍可以使用&header
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.