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

Iva*_*van 19 syntax types scala

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

Jör*_*tag 32

关于您的第一个问题,您可以简单地使用类型别名:

type KeyValue = (Int, String)
Run Code Online (Sandbox Code Playgroud)

当然,Scala是一种面向对象的语言,所以关于如何专门化元组的第二个,神奇的词是继承:

case class KeyValue(key: Int, value: String) extends (Int, String)(key, value)
Run Code Online (Sandbox Code Playgroud)

而已.该课程甚至不需要身体.

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

但请注意,从case类(即Tuple2)继承的内容已弃用,将来可能不允许使用.以下是您为上述类定义获得的编译器警告:

警告:案例类class KV有案例类祖先class Tuple2.这已被弃用,因为使用和实现过于复杂.您应该使用提取器在非叶节点上进行模式匹配.


Ste*_*ury 18

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

元组示例:

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

案例类:

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
Run Code Online (Sandbox Code Playgroud)

  • @Ivan:元组*是*案例类,不是吗? (6认同)
  • 元组确实是案例类! (4认同)