groovy中如何从返回函数中接受多个参数
我想从用groovy编写的函数返回多个值并接收它们,但我得到了一个错误 类org.codehaus.groovy.ast.expr.ListExpression,其值为“[a, b] “,作为赋值的左侧是一个不好的表达式 接线员 我的代码是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
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]
}