Scala:将空序列与 Nil 匹配

Mat*_*oob 5 collections scala pattern-matching hierarchical

为什么会出现以下情况:

val x: Seq[Any] = Vector.empty
x match {
 case Nil => 1
 case _ => 2
}
Run Code Online (Sandbox Code Playgroud)

其中Vector.empty内部等于:

private[immutable] val NIL = new Vector[Nothing](0, 0, 0)
override def empty[A]: Vector[A] = NIL
Run Code Online (Sandbox Code Playgroud)

匹配Nil并返回1?不Nil只是 的特定子类型吗Seq

如果我使用更通用的 . 答案仍然相同Seq.empty。这是为什么?

Ale*_*nov 5

根据规范,此模式匹配 when x == Nil,其中 forSeq 被定义为

如果该序列与此序列具有相同顺序的相同元素,则为 true,否则为 false

事实也是如此Vector.empty == Nil

如果您确实想检查Nil模式匹配中的对象是否准确,请使用以下方法之一:

case _: Nil.type =>
case x if x eq Nil =>
Run Code Online (Sandbox Code Playgroud)