有没有办法为groovy脚本指定构造函数?

有没有办法为groovy脚本指定构造函数?,groovy,Groovy,我有一个名为Foo.groovy的groovy脚本,可以使用以下语法构造该脚本的实例: def foo = new Foo() def foo = new Foo(bar: 'baz') 我知道Foo.groovy是否看起来像: import groovy.transform.Field @Field def bar def someMethod() { //... } 以下语法: def foo = new Foo() def foo = new Foo(bar: 'baz')

我有一个名为Foo.groovy的groovy脚本,可以使用以下语法构造该脚本的实例:

def foo = new Foo()
def foo = new Foo(bar: 'baz')
我知道Foo.groovy是否看起来像:

import groovy.transform.Field

@Field def bar

def someMethod() {
  //...
}
以下语法:

def foo = new Foo()
def foo = new Foo(bar: 'baz')
将使用一些默认构造函数并实际将bar字段设置为baz, 但假设我想操纵bar的传递值来添加 结尾的感叹号像so${bar}

希望能够执行以下无法正常工作的操作:

import groovy.transform.Field

@Field def bar

Foo(args) {
  bar = "${args.bar}!"
}

def someMethod() {
  //...
}

在groovy中是否有一种惯用的方法来实现这一点?

脚本主体中的任何自由变量都可以在绑定对象之外得到满足。它的工作原理非常类似于映射,因为它有一个基于映射的构造函数,并且重载了getProperty和setProperty

主脚本:

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
}
import groovy.transform.Field

@Field def bar

void setBar(def bar){
    this.bar = "${bar}!"
    println "Setter is executed. ${bar} -> ${this.bar}"
}

我还没有尝试过这个方法,但将它插入Groovy控制台并查看结果应该很容易。

您可以使用setter方法

Foo.groovy:

someMethod(bar + '!')

def someMethod(baz) { // bar/baz value must be passed in
  // do something with baz
}
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!

通常,您不会显式地构造和引导Groovy脚本。通常,您会在IDE中使用groovy命令或等效命令运行它,并在命令行上传递绑定参数。谢谢@emilles,这是在jenkins共享库的上下文中,我有一系列脚本,我正在调用新的脚本。我知道这有点奇怪,但jenkins环境有点奇怪:我认为有一个import/include方法可以使子脚本在另一个脚本中可用。否则,除非您另有指定,否则脚本是groovy.lang.script的子类。您可以使用默认构造函数构造一个实例,调用setBinding传递自由变量的上下文,并调用run执行。得到一个静态main方法。因此,您应该能够调用Foo.mainargs,并且应该将来自一个脚本绑定的args传输到另一个脚本绑定。