我有一个简单的代码,它根据长度为 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/