groovy中如何从返回函数中接受多个参数

groovy中如何从返回函数中接受多个参数,groovy,Groovy,我想从用groovy编写的函数返回多个值并接收它们,但我得到了一个错误 类org.codehaus.groovy.ast.expr.ListExpression,其值为“[a, b] “,作为赋值的左侧是一个不好的表达式 接线员 我的代码是 int a=10 int b=0 println "a is ${a} , b is ${b}" [a,b]=f1(a) println "a is NOW ${a} , b is NOW ${b}" def f1(int x) { return

我想从用groovy编写的函数返回多个值并接收它们,但我得到了一个错误

类org.codehaus.groovy.ast.expr.ListExpression,其值为“[a, b] “,作为赋值的左侧是一个不好的表达式 接线员

我的代码是

int a=10
int b=0
println "a is ${a} , b is ${b}"
[a,b]=f1(a)
println "a is NOW ${a} , b is NOW ${b}"

def f1(int x) {   
  return [a*10,a*20]
}

你差点就成功了。从概念上讲,
[a,b]
创建一个列表,然后
(a,b)
打开一个列表,因此您希望
(a,b)=f1(a)
而不是
[a,b]=f1(a)

另一个返回对象的示例,不需要相同类型:

final Date foo
final String bar
(foo, bar) = baz()
println foo
println bar

def baz() {
    return [ new Date(0), 'Test' ]
}
此外,您还可以组合声明和赋值:

final def (Date foo, String bar) = baz()
println foo
println bar

def baz() {
    return [ new Date(0), 'Test' ]
}

您可以声明和分配返回值存储在一行中的变量,如下所示,这是一种比Justin答案中使用的语法稍微紧凑的语法:

def (int a, int b) = f1(22)

在您的特定情况下,您可能无法使用此选项,因为传递给
f1
的变量之一也用于存储返回值

在Jenkins pipeline作业的上下文中运行Groovy时,上述答案不起作用(至少在版本2.60.2上),但以下答案起作用:

node {
    obj = ret2()
    fw = obj[0]
    lw = obj[1]
    echo "fw=${fw}"
    echo "lw=${lw}"
}

def ret2()
{
    return [5, 7]
}
或者:

node {
    obj = ret2()
    fw = obj.a
    lw = obj.b
    echo "fw=${fw}"
    echo "lw=${lw}"
}

def ret2()
{
    return [a:5, b:7]
}

在答案中添加一行以突出显示OP需要进行的更改,因为8行代码中的不同括号很容易被忽略。如果返回类型是object,那么会发生什么?谁能解释一下吗。我想从一个方法中返回多个对象,这几乎是一样的。我将添加一个带有日期的例子。贾斯汀在上面写的“展开”在技术上更为正确和常见的术语是“解构”;在本例中,调用语句是解构赋值语句。有关详细信息,请参阅。有关如何根据您甚至不需要括号内的
int
声明返回不同编程语言的多个值的有用链接。
node {
    obj = ret2()
    fw = obj.a
    lw = obj.b
    echo "fw=${fw}"
    echo "lw=${lw}"
}

def ret2()
{
    return [a:5, b:7]
}