how to accept multiple parameters from returning function in groovy

Groovy

Groovy Problem Overview


I want to return multiple values from a function written in groovy and receive them , but i am getting an error

> class org.codehaus.groovy.ast.expr.ListExpression, with its value '[a, > b]', is a bad expression as the left hand side of an assignment > operator

My code is

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

Groovy Solutions


Solution 1 - Groovy

You almost have it. Conceptually [ a, b ] creates a list, and ( a, b ) unwraps one, so you want (a,b)=f1(a) instead of [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]
}

Another example returning objects, which don't need to be the same type:

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

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

Additionally you can combine the declaration and assignment:

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

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

Solution 2 - Groovy

You can declare and assign the variables in which the return values are stored in one line like this, which is a slightly more compact syntax than that used in Justin's answer:

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

In your particular case you may not be able to use this because one of the variables passed to f1 is also used to store a return value

Solution 3 - Groovy

When running Groovy in the context of Jenkins pipeline job the above answers do not work (at least on version 2.60.2), but the following does:

node {
	obj = ret2()
	fw = obj[0]
	lw = obj[1]
	echo "fw=${fw}"
	echo "lw=${lw}"
}

def ret2()
{
    return [5, 7]
}

Or alternatively:

node {
	obj = ret2()
	fw = obj.a
	lw = obj.b
	echo "fw=${fw}"
	echo "lw=${lw}"
}

def ret2()
{
    return [a:5, b:7]
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNikhil SharmaView Question on Stackoverflow
Solution 1 - GroovyJustin PiperView Answer on Stackoverflow
Solution 2 - GroovyDónalView Answer on Stackoverflow
Solution 3 - GroovyIsrael ShainertView Answer on Stackoverflow