我可以在Scala 2.8中命名一个元组(定义一个结构吗?)?

时间:2010-09-10 19:45:42

标签: scala syntax types

每次我需要时总是重复一个行长的元组定义对我来说并不是很好。我可以将其命名并用作类型名称吗?很高兴为其字段命名,而不是使用._1,._2等。

4 个答案:

答案 0 :(得分:32)

关于第一个问题,您只需使用类型别名:

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具有案例类祖先class Tuple2。这已被弃用,因为使用和实现过于复杂。您应该使用提取器在非叶节点上进行模式匹配。

答案 1 :(得分:18)

类型别名可用于命名您的元组,但请尝试使用案例类。您将能够使用命名参数

元组示例:

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

使用案例类:

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

答案 2 :(得分: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)

然而,正如其他人所提到的,你可能应该只创建一个案例类。

答案 3 :(得分:1)

虽然正如其他人所说,明确(案例)类在一般意义上是最好的。

但是对于本地化方案,您可以使用a promise was created in a handler but none were returned from it来提高代码可读性:

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)
}