scala學習手記5 - 元組與多重賦值


假定要在一個方法中返回多個值。比如需要返回一個人的名、姓和郵箱地址。在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)

再來看一下執行結果:

image

多重賦值成功了。注釋中的“硬編碼”是什么意思在百度后知道了:硬編碼是指將可變變量用一個固定值來代替的方法。還有一點就是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)

執行后報錯了:

image

不賦值的話也可以使用索引來訪問元組中的元素,像這樣:

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)

再來看一下執行結果:

image

就這樣。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM