web-dev-qa-db-fra.com

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

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]
}
54
Nikhil Sharma

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' ]
}
96
Justin Piper

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

39
Dónal

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]
}
2
Israel Shainert