2010-09-10 39 views

回答

31

關於你的第一個問題,你可以簡單地用一個類型別名:

type KeyValue = (Int, String) 

,當然,Scala是一種面向對象的語言,因此關於你的第二個關於如何專門的元組,口令字是繼承

case class KeyValue(key: Int, value: String) extends (Int, String)(key, value) 

就是這樣。班級甚至不需要身體。

val kvp = KeyValue(42, "Hello") 
kvp._1 // => res0: Int = 42 
kvp.value // => res1: String = "Hello" 

但是請注意,從殼體類繼承(其Tuple2是),不推薦使用,並且可以在將來禁止。以下是編譯器警告你得到上面的類定義:

警告:案例類class KV有case類祖先class Tuple2。由於過度複雜的使用和實施,這已被棄用。您應該使用提取器在非葉節點上進行模式匹配。

18

類型別名適用於命名您的元組,但嘗試使用case類代替。你將能夠使用命名參數與元組

例子:

def foo(a : Int) : (Int, String) = { 
    (a,"bar") 
} 
val res = foo(1) 
val size = res._1 
val name= res._2 

與Case類:

case class Result(size : Int , name : String) 
def foo(a : Int) : Result = { 
    Result(a,"bar") 
} 
val res = foo(1) 
val size = res.size 
val name= res.name 
+0

不要元組的工作比快的情況下班?這項任務是對大量簡單數據的複雜處理,這是一種數字處理。 – Ivan 2010-09-10 20:06:20

+6

@Ivan:元組*是* case類,他們不是嗎? – 2010-09-10 20:08:45

+4

元組確實是案例類! – 2010-09-10 20:16:21

4

下面是一個創建一個類型別名和工廠對象的解決方案。

scala> type T = (Int, String)       
defined type alias T 

scala> object T { def apply(i: Int, s: String): T = (i, s) } 
defined module T 

scala> new T(1, "a") 
res0: (Int, String) = (1,a) 

scala> T(1, "a") 
res1: (Int, String) = (1,a) 

然而,正如其他人所說,你可能應該只是創建一個案例類。

0

雖然正如其他人所說,明確(案例)類是一般意義上最好的。

然而,對於局部的情況,你可以做的是使用tuple extractor來提高代碼的可讀性:

val (first, second) = incrementPair(3, 4) 
println(s"$first ... $second") 

考慮返回一個元組的方法:

def incrementPair(pair: (Int, Int)) : (Int, Int) = { 
    val (first, second) = pair 
    (first + 1, second + 1) 
} 
相關問題