我有一个名为Foo.groovy
的常规脚本,可以使用以下语法构造该脚本的实例:
def foo = new Foo()
我知道Foo.groovy
的样子:
import groovy.transform.Field
@Field def bar
def someMethod() {
//...
}
以下语法:
def foo = new Foo(bar: 'baz')
将使用一些默认的构造函数,并将bar
字段实际设置为baz
,
但假设我想操纵bar
的传递值来添加一个
像这样"${bar}!"
希望能够执行以下操作(在AFAIK中无效):
import groovy.transform.Field
@Field def bar
Foo(args) {
bar = "${args.bar}!"
}
def someMethod() {
//...
}
是否有一种惯用的方式来实现这一目标?
答案 0 :(得分:1)
您可以使用setter方法
(Foo.groovy):
import groovy.transform.Field
@Field def bar
void setBar(def bar){
this.bar = "${bar}!"
println "Setter is executed. ${bar} -> ${this.bar}"
}
如果主叫方看起来像
import Foo
def foo = new Foo(bar: 'baz')
println foo.bar
出现以下结果:
Setter is executed. baz -> baz!
baz!
答案 1 :(得分:0)
可以从Binding对象中满足脚本主体中的任何自由变量。它的工作原理非常类似于地图,因为它具有基于地图的构造函数,并重载了getProperty和setProperty。 http://docs.groovy-lang.org/latest/html/gapi/groovy/lang/Binding.html
主脚本:
def binding = new Binding(bar: 'baz')
def foo = new Foo(binding)
foo.run()
Foo.groovy:
someMethod(bar + '!')
def someMethod(baz) { // bar/baz value must be passed in
// do something with baz
}
我还没有尝试过,但是将它插入Groovy Console并查看会发生什么应该足够容易。