假定要在一個方法中返回多個值。比如需要返回一個人的名、姓和郵箱地址。在Java中最常用的方法是定義一個Person類,其中包括相對應的字段;還有些不常用的方法就是返回一個集合或數組,拿到結果后再進行循環取值。在Scala中我們又多一個選擇:元組。
元組是一個不可變的對象序列,可以使用逗號分隔的值進行創建,比如這個有3個對象的元組:(“robin”, “zhang”, “robin@zhyea.com”)。
元組的一個特性就是多重賦值,就是可以將元組中的元素賦值給多個val或var。
下面是一個例子:
def getPersonInfo (primaryKey: Int) = { //假設使用primaryKey獲取用戶信息 //這里的返回值被硬編碼了 ("robin", "zhang", "robin@zhyea.com") } val (firstName, lastName, email) = getPersonInfo (1); println ("firstName: " + firstName) println ("lastName: " + lastName) println ("email: " + email)
再來看一下執行結果:
多重賦值成功了。注釋中的“硬編碼”是什么意思在百度后知道了:硬編碼是指將可變變量用一個固定值來代替的方法。還有一點就是getPersonInfo方法中返回結果沒有使用return,這也是scala支持的一個特性:在scala中的方法中將最后出現的變量作為return的值。要使用return必須顯示指定返回類型,從而使scala失去推斷返回值類型的能力。必須使用return意味着存在“多路徑返回”的問題,需要借助return的中斷返回的特性來處理多分支問題。在scala中不鼓勵使用return。
如果嘗試將方法返回結果賦值給數量不一致的變量scala就會報錯,如果是在編譯代碼而不是作為腳本執行,那么在編譯期間就會報錯。
將代碼調整成這樣:
def getPersonInfo (primaryKey: Int) = { //假設使用primaryKey獲取用戶信息 //這里的返回值被硬編碼了 ("robin", "zhang", "robin@zhyea.com") } val (firstName, lastName) = getPersonInfo (1); println ("firstName: " + firstName) println ("lastName: " + lastName)
執行后報錯了:
不賦值的話也可以使用索引來訪問元組中的元素,像這樣:
val info = getPersonInfo (1); println ("firstName: " + info._1) println ("lastName: " + info._2) println ("email: " + info._3)
元組不僅僅對多重賦值中有用。在並發編程里,使用元組可以把一組數據值作為消息在Actor之間傳遞(它們不變的屬性剛好在這里派得上用場)。這一點先記下來。
scala的元組還有一個特性,就是元組中的值可以是不同類型。稍稍調整了下之前的代碼:
def getPersonInfo (primaryKey: Int) = { //假設使用primaryKey獲取用戶信息 //這里的返回值被硬編碼了 ("robin", "zhang", 29, "robin@zhyea.com") } val info = getPersonInfo (1); println ("firstName: " + info._1) println ("lastName: " + info._2) println ("age: " + info._3) println ("email: " + info._4)
再來看一下執行結果:
就這樣。