3

Groovy 中有没有办法替换如下代码:

Task a = new Task('a')
Process p = new Process('p')

用一些更简单的东西,比如:

task a
process p

wheretask并且process可以是创建对象并将其返回或将其添加到脚本 Map 的方法调用。

我目前遇到的主要问题是我无法使用a,因为它没有定义。

4

2 回答 2

5

要创建对象并为其命名而不分配给变量,您可以使用绑定。创建并保留对闭包绑定的引用,并拥有实用方法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()

请注意,您必须引用ab因此它们被解释为字符串而不是未定义的变量。如果你想省略引号,你可以使用一个自定义的 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
}
于 2012-09-19T20:13:59.020 回答
1

尝试这个:

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

于 2012-09-30T08:55:02.013 回答