2011-07-20 3 views
46

quiero devolver varios valores de una función escrita en el maravilloso y recibirlos, pero estoy recibiendo un errorcómo aceptar múltiples parámetros de función que devuelve en el maravilloso

org.codehaus.groovy.ast clase. expr.ListExpression, con su valor '[a, b ]', es una mala expresión como el lado izquierdo de una asignación operador

Mi código es

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

enlace útil sobre cómo devolver varios valores para diferentes lenguajes de programación https : //rosettacode.org/wiki/Return_multiple_values#Groovy –

Respuesta

77

Casi lo tienes. Conceptualmente [ a, b ] crea una lista y (a, b) desenvuelve una, por lo que desea (a,b)=f1(a) en lugar 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] 
} 

Otro ejemplo de regresar objetos, los cuales no necesitan ser del mismo tipo:

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

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

Además se puede combinar la declaración y asignación:

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

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

Gracias. Lo tengo. –

+0

Agregó una línea a la respuesta para resaltar el cambio que el OP necesitaba hacer ya que diferentes corchetes en 8 líneas de código se pueden perder fácilmente. – ArtB

+0

Si los tipos de devolución son un objeto, ¿qué pasará? ¿Alguien puede explicar por favor? Quiero devolver múltiples objetos desde un método. –

34

Puede declarar y Asigne las variables en las que los valores de retorno se almacenan en una línea como esta, que es una sintaxis un poco más compacta que la utilizada en la respuesta de Justin:

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

En su caso particular, es posible que no sea capaz de utilizar esto porque una de las variables pasadas al f1 también se utiliza para almacenar un valor de retorno

+0

De acuerdo con [Groovy Goodness] (http://mrhaki.blogspot.de/2009/09/groovy-goodness-multiple-assignments.html), ni siquiera necesita las declaraciones 'int' entre paréntesis. – sschuberth

Cuestiones relacionadas