對我而言,每次我需要時總是重複一個行長的元組定義,這對我來說並不好。我可以將其命名並用作類型名稱嗎?會很高興地命名其字段也代替使用._1,._2等我可以在Scala 2.8中命名一個元組(定義一個結構?)嗎?
17
A
回答
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
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)
}
相關問題
- 1. 我可以在Scala類中定義一個無名方法嗎?
- 2. 我們可以在類型上定義一個結構嗎?
- 3. 我可以定義一個鍵是結構的地圖嗎?
- 4. 在結構本身之前可以定義一個結構成員(函數)嗎?
- 5. 如何在Scala 2.8註釋中指定一個靜態數組?
- 6. 可能在C結構中定義一個函數嗎?
- 7. 我可以在C中擴展一個結構嗎?
- 8. 我可以在結構中放置一個函數嗎?
- 9. 在Ruby中可以定義一個名稱以(冒號)結尾的方法嗎?
- 10. 可以修改一個結構嗎?
- 11. 我可以根據迭代定義一個變量名嗎?
- 12. 我可以把一個元組放入python數組中嗎?
- 13. 我可以在一個命令中重定向兩頁嗎?
- 14. 可以在Sass中定義一個數組嗎?
- 15. 定義一個未命名的文檔的結構Spyder的
- 16. 我可以用任何字節數組(Scala)構造一個BigInt嗎?
- 17. 我可以在Scala中一次導入多個包嗎?
- 18. 我可以在protobuf中定義一個常量字符串嗎?
- 19. 我可以在XAML中定義一個變量嗎?
- 20. 我可以在Kohana 3中使用一個路徑定義嗎?
- 21. 我可以在自定義類型中放置一個CollaborativeString嗎?
- 22. 我可以在Clojure中定義一個java接口嗎?
- 23. 我可以在Razor視圖中定義一個枚舉嗎?
- 24. 我可以在Icenium中定義一個config xml文件嗎?
- 25. 我可以在while循環中定義一個迭代器嗎?
- 26. 轉:可以在一個結構中建模一般的JSON數組嗎?
- 27. 我應該爲一個函數的唯一目的定義一個結構嗎?
- 28. 我可以直接用類型化元組定義一個函數頭嗎?
- 29. 我可以定義哪些字符可以「破」一個字嗎?
- 30. 我可以給lambda一個名字嗎?
不要元組的工作比快的情況下班?這項任務是對大量簡單數據的複雜處理,這是一種數字處理。 – Ivan 2010-09-10 20:06:20
@Ivan:元組*是* case類,他們不是嗎? – 2010-09-10 20:08:45
元組確實是案例類! – 2010-09-10 20:16:21