scala - 为什么unapplySeq在模式匹配中涉及案例类或元组

标签 scala

我有一个简单的代码,用于将元素与长度为 26 的 Seq 进行匹配。

  test("Seq Pattern matching") {
    val x = 1 to 26
    x match {
      case Seq(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z) => println(a)
    }
  }

它会调用Seq.unapplySeq方法来解构Seq对象x,但令我惊讶的是,该代码会导致编译错误:

Error:(82, 12) too many arguments for unapply pattern, maximum = 22
      case Seq(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z) => println(a) 

在unapplySeq方法中,它与具有22个字段限制的案例类或元组没有任何关系。

所以,我想问为什么会发生错误(为什么 case class/tuple fields limit 会导致这个问题)

我使用的是 Scala 2.11.8

最佳答案

我弄清楚了 unapplySeq 方法背后发生的事情,它涉及元组,

对于 (1 到 10)匹配 { case Seq(a, b, c, d, e, f, g, h, i, j) => (a, b, c); 情况 _ => (1, 2, 3); }

类似于:

scala.Predef.intWrapper(1).to(10) match {
  case scala.collection.Seq.unapplySeq[Int](<unapply-selector>) <unapply> ((a @ _), (b @ _), (c @ _), (d @ _), (e @ _), (f @ _), (g @ _), (h @ _), (i @ _), (j @ _)) => scala.Tuple3.apply[Int, Int, Int](a, b, c)
  case _ => scala.Tuple3.apply[Int, Int, Int](1, 2, 3)
}

关于scala - 为什么unapplySeq在模式匹配中涉及案例类或元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52031982/

相关文章:

java - 在 Eclipse 中为 Java 和 Scala 设置不同的选项卡空间

scala - 用于带有错误累积的异步处理的函数签名

scala - 如何从另一个 sbt 项目引用外部 sbt 项目?

scala - 我可以在 Play Framework 的模板/ View 中调用 session 吗

java - 使用 Java 的 Spark 作业服务器

scala - scala.concurrent.Future 何时开始执行?

algorithm - 斯卡拉 : Sorting list of number based on another list

eclipse - Scala 的相关包导入

scala - 为什么在Scala中类型检查和类型转换被认为是较差的样式?

scala - 如何在 Scala 中从 Spark 检索和更新 HBase 表