57 votes

comment accepter plusieurs paramètres de la fonction de retour dans groovy

Je veux retourner plusieurs valeurs d'une fonction écrite en groovy et les recevoir, mais j'obtiens une erreur

classe org.codehaus.groovy.ast.expr.ListExpression, avec sa valeur '[a, b]', est une mauvaise expression comme le côté gauche d'une affectation opérateur

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]
}

105voto

Justin Piper Points 1196

Vous l'avez presque. Conceptuellement, [ a, b ] crée une liste et ( a, b ) 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' ]
}

40voto

Dónal Points 61837

Vous pouvez déclarer et affecter les variables dans lesquelles les valeurs de retour sont stockées sur une 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 l'utiliser car l'une des variables passées à f1 est également utilisée pour stocker une valeur de retour

4voto

Israel Shainert Points 41

Lors de l'exécution de Groovy dans le contexte d'un 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]
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X