Groovy 中有没有办法替换如下代码:
Task a = new Task('a')
Process p = new Process('p')
用一些更简单的东西,比如:
task a
process p
wheretask
并且process
可以是创建对象并将其返回或将其添加到脚本 Map 的方法调用。
我目前遇到的主要问题是我无法使用a
,因为它没有定义。
要创建对象并为其命名而不分配给变量,您可以使用绑定。创建并保留对闭包绑定的引用,并拥有实用方法task
并将process
新实例与名称相关联。例如:
def scriptBinding = new Binding()
def task = { String name ->
scriptBinding[name] = new Task(name)
}
def process = { String name ->
scriptBinding[name] = new Process(name)
}
def script = {
task 'a'
process 'b'
println a
println b
}
script.binding = scriptBinding
script()
请注意,您必须引用a
,b
因此它们被解释为字符串而不是未定义的变量。如果你想省略引号,你可以使用一个自定义的 Binding 对象来评估未定义的符号作为它们的字符串表示,如下所示:
class SymbolAsStringBinding extends Binding {
Object getVariable(String name) {
try {
super.getVariable(name)
} catch (MissingPropertyException e) {
name
}
}
boolean hasVariable(String name) {
true
}
}
添加后,您可以将脚本编写为:
def script = {
task a
process b
println a
println b
}
尝试这个:
class Task {
String name
Task(name) { this.name = name }
String toString() { "task: $name".toString() }
}
def propertyMissing(String name) { this.getBinding()[name] = name }
def task(name) { this.getBinding()[name] = new Task(name) }
task a
println a
这将产生:
task: a
基本上当你到达
task a
声明propertyMissing()
将在绑定中放入一个以a
它的名称命名的变量。稍后,该task()
函数将用a
新的任务替换绑定中的变量,并将缺失变量的名称作为名称传递a