2011-07-20 82 views
46

我想從Groovy編寫的函數返回多個值,並接受他們,但我得到一個錯誤如何接受返回函數的多個參數在Groovy

類org.codehaus.groovy.ast。 expr.ListExpression,以其值 '並[a, b]',是一個壞的表達作爲賦值 操作者的左手側

我的代碼是

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

有用的鏈接://rosettacode.org/wiki/Return_multiple_values#Groovy –

回答

77

你幾乎擁有它。概念上[ a, b ]創建了一個列表,並且(a, b)解開了一個,所以你想要(a,b)=f1(a)而不是[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] 
} 

又如返回對象,這並不需要是同一類型:

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

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

此外,您可以合併申報和分配:

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

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

謝謝。得到它了。 –

+0

在答案中增加了一行以突出顯示OP所需的更改,因爲可以輕鬆地忽略8行代碼中的不同括號。 – ArtB

+0

如果返回類型是對象,那麼會發生什麼?任何人都可以解釋請。我想從一個方法返回多個對象。 –

34

可以聲明和將返回值存儲在一行中的變量賦值爲這樣,這比Justin的答案中使用的語法稍微更緊湊:

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

在您的特定情況下,你可能無法使用,是因爲傳遞給f1變量之一,也是用來存儲返回值就如何爲不同的編程語言HTTPS返回多個值

+0

根據[Groovy Goodness](http://mrhaki.blogspot.de/2009/09/groovy-goodness-multiple-assignments.html),您甚至不需要括號內的「int」聲明。 – sschuberth

相關問題