在Scala中接受函数中元组的语法

时间:2015-12-25 19:43:44

标签: scala

我想要一个函数来消耗7的元组,但编译器不会让我显示所显示的消息。我没有找到一个正确的方法来做到这一点。甚至可以在没有明确地输入所有类型参数(如Tuple7[String,String...,String])的情况下进行,甚至可以像这样使用Scala?

def store(record:Tuple7): Unit = {

  }
  

错误:(25,20)类Tuple7采用类型参数

     

def store(record: Tuple7): Unit = { ^

2 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

def store(record: (String, String, String, String, String, String, String)):Unit = {
  }

相当于:

def store(record: Tuple7[String, String, String, String, String, String, String]):Unit = {
  }

您可以在Scala编程中阅读更多相关内容,第2版,“Scala中的后续步骤”,章节“步骤9.使用元组”。

答案 1 :(得分:2)

如路易斯所述,您必须定义TypeTuple中每个职位的哪个职位进行定义。

我想添加一些方法来以不同的方式表达相同的行为:

元组语法

为此,您有两种选择,使用什么语法:

Tuple3[String, Int, Double]
(String, Int, Double)

使用Case Classes提高可读性的方法

长元组很难处理,特别是在重复类型时。 Scala提供了一种不同的方法来处理这个问题。您可以使用带有七个字段的Tuple7代替case class。这种方法的好处在于您现在可以将说话名称附加到每个字段,并且如果附加了名称,每个位置的键入也更有意义。 并且将价值放在错误位置的可能性降低了

(String, Int, String, Int)
// vs
case class(name: String, age: Int, taxNumber: String, numberOfChildren: Int)

Seqpattern matching

一起使用

如果你打算将一系列数据seqpattern matching结合使用,那也很合适:

List("name", 24, "", 5 ) match {
  case name:String :: age:Int ::_ :: _ :: Nil => doSomething(name, age)
}

这只适用于范围相当缩小的情况。通常,您会丢失很多类型信息,因为List的类型为Any