在阅读post关于如何在Vector
(或任何实现Seq
的集合)上使用模式匹配之后,我在此集合上测试了模式匹配。
scala> x // Vector
res38: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3)
scala> x match {
| case y +: ys => println("y: " + "ys: " + ys)
| case Nil => println("empty vector")
| }
<console>:12: error: pattern type is incompatible with expected type;
found : scala.collection.immutable.Nil.type
required: scala.collection.immutable.Vector[Int]
Note: if you intended to match against the class, try `case _: <none>`
case Nil => println("empty vector")
^
以下dhg
的答案解释了+:
:
object +: {
def unapply[T](s: Seq[T]) =
s.headOption.map(head => (head, s.tail))
}
REPL
告诉我
scala> Vector[Int]() == Nil
res37: Boolean = true
...为什么我不能将此case Nil
语句用于Vector
?
答案 0 :(得分:27)
比较Vector[Int]() == Nil
是可能的,因为您比较的类型级别没有约束;另一方面,它允许为集合实现equals
,无论集合类型如何,都可以逐元素地执行:
Vector(1, 2, 3) == List(1, 2, 3) // true!
在模式匹配中,当类型与列表无关时(Nil
),您不能拥有空列表(Vector
)的大小写。
你可以这样做:
val x = Vector(1, 2, 3)
x match {
case y +: ys => println("head: " + y + "; tail: " + ys)
case IndexedSeq() => println("empty vector")
}
但我建议在这里使用默认情况,因为如果x
没有head元素,那么它必须在技术上是空的:
x match {
case y +: ys => println("head: " + y + "; tail: " + ys)
case _ => println("empty vector")
}