【问题标题】:Syntax for accepting tuple in a function in ScalaScala 函数中接受元组的语法
【发布时间】:2015-12-25 19:43:44
【问题描述】:

我想要一个函数来使用 7 的元组,但编译器不会让我使用显示的消息。我没有找到正确的方法来做到这一点。是否有可能不显式输入所有类型参数,如 Tuple7[String,String...,String],像这样使用 Scala 是不是一个好主意?

def store(record:Tuple7): Unit = {

  }

Error:(25, 20) class Tuple7 采用类型参数

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

【问题讨论】:

  • 我认为使用这种大小的元组通常不是一个好主意,特别是如果它们存储 7 个相同类型的项目 (String) 。您可能应该考虑为此使用case class,因为您可以明确命名每个项目。
  • @dev-null 编译器要求您指定元组的类型,例如("foo", "bar")Tuple2[String, String],如果您不关心特定类型或用例类或使用类型别名使其不那么冗长,您可以使用 Tuple2[_, _] 解决此问题:type S = String; Tuple3[S, S, S]

标签: scala


【解决方案1】:

正如 Luis 所说,您必须为 Tuple 中的每个位置定义 Type 的位置。

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

元组语法

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

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

使用Case Classes 以获得更好的可读性

长元组很难处理,尤其是当类型重复时。 Scala 提供了一种不同的方法来处理这个问题。您可以使用带有七个字段的case class 而不是Tuple7。这种方法的好处是您现在可以将说话的名称附加到每个字段,并且如果附加名称,则每个位置的输入更有意义。 并且减少了将值放在错误位置的机会

(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

【讨论】:

    【解决方案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 步。使用元组”中了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多