2010-09-10 121 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) 
} 
相关问题