Je veux retourner plusieurs valeurs d'une fonction écrite en groovy et les recevoir, mais je reçois une erreur
la classe org.codehaus.groovy.ast.expr.ListExpression, avec sa valeur "[a, b]", est une mauvaise expression en tant que côté gauche d'un opérateur d'affectation
Mon code est
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]
}
Vous l'avez presque. Conceptuellement, [ a, b ]
Crée une liste et ( a, b )
En déroule une, vous voulez donc (a,b)=f1(a)
Au lieu de [a,b]=f1(a)
.
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 [x*10,x*20]
}
Un autre exemple de retour d'objets, qui n'ont pas besoin d'être du même type:
final Date foo
final String bar
(foo, bar) = baz()
println foo
println bar
def baz() {
return [ new Date(0), 'Test' ]
}
De plus, vous pouvez combiner la déclaration et la cession:
final def (Date foo, String bar) = baz()
println foo
println bar
def baz() {
return [ new Date(0), 'Test' ]
}
Vous pouvez déclarer et affecter les variables dans lesquelles les valeurs de retour sont stockées sur une seule ligne comme celle-ci, qui est une syntaxe légèrement plus compacte que celle utilisée dans la réponse de Justin:
def (int a, int b) = f1(22)
Dans votre cas particulier, vous ne pourrez peut-être pas utiliser ceci car l'une des variables passées à f1
est également utilisé pour stocker une valeur de retour
Lors de l'exécution de Groovy dans le contexte du travail de pipeline Jenkins, les réponses ci-dessus ne fonctionnent pas (au moins sur la version 2.60.2), mais ce qui suit fonctionne:
node {
obj = ret2()
fw = obj[0]
lw = obj[1]
echo "fw=${fw}"
echo "lw=${lw}"
}
def ret2()
{
return [5, 7]
}
Ou bien:
node {
obj = ret2()
fw = obj.a
lw = obj.b
echo "fw=${fw}"
echo "lw=${lw}"
}
def ret2()
{
return [a:5, b:7]
}