val l = 1::2::Nil
l match{ case x :: y:: Nil => println(x,y)}
执行上述代码段时发生警告:
<console>:12: warning: match may not be exhaustive.
It would fail on the following inputs: List(_), List(_, _, _), Nil
l match{ case x :: y:: Nil => println(x,y)}
^
(1,2)
但是,l match{ case List(x,y) => println(x,y)}
效果很好。
为什么呢?
答案 0 :(得分:3)
::
是一个案例类(请参阅sources)。案例类具有自动检查详尽性(如果从密封特征或密封的抽象类继承),因此当您匹配::(x, ::(y, Nil))
编译器时可以这样做。有关详细信息,请参阅this article(请记住,案例类不是ADT,但可以对其进行建模)。
List(a,b)
只会导致从伴侣对象调用List.unapplySeq
(请参阅8.1.1 Extractor Patterns),这意味着编译器无法进行额外检查,因为它(简单地说)只是转换{{ 1}}进入case List(a,b)
来电。
以下是检查所有可能输入的总函数示例:
unapplySeq