我有一个简单的代码,它根据长度为 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 个字段限制的案例类或元组没有任何关系。

所以,我会问为什么会发生错误(为什么案例类/元组字段限制会导致这个问题)

我正在使用 Scala 2.11.8

最佳答案

我想出了 unapplySeq 方法背后发生的事情,它涉及元组,

为了 (1 to 10) match { case Seq(a, b, c, d, e, f, g, h, i, j) => (a, b, c); case _ => (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 在模式匹配中涉及 case 类或元组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52031982/

10-10 15:07