假设我有一个特质,父母,和一个孩子,孩子。
scala> sealed trait Parent
defined trait Parent
scala> case object Boy extends Parent
defined module Boy
我写了一个函数来匹配sealed trait上的模式。我的f
函数是total,因为只有一个Parent
示例。
scala> def f(p: Parent): Boolean = p match {
| case Boy => true
| }
f: (p: Parent)Boolean
然后,2个月后,我决定添加Parent
的Girl
子节点。
scala> case object Girl extends Parent
defined module Girl
然后重写f
方法,因为我们使用的是REPL。
scala> def f(p: Parent): Boolean = p match {
| case Boy => true
| }
<console>:10: warning: match may not be exhaustive.
It would fail on the following input: Girl
def f(p: Parent): Boolean = p match {
^
f: (p: Parent)Boolean
如果我遇到一个非穷举匹配,那么我会得到一个编译时警告(如我们在这里看到的)。
但是,如何在非穷举匹配上使编译失败?
4条答案
按热度按时间r1wp621o1#
您可以将
-Xfatal-warnings
添加到Scalac的选项中。这样,任何警告都将被视为错误。在sbt中,您可以通过以下方式实现:
ogsagwnx2#
从scalac 2.13.2开始,警告的控制变得相当精细。得到OP要求的内容:
Detailed howto by Lukas Rytz.
btqmn9zl3#
Sbt和Scala3的编译器标志:
scalacOptions += "-Ycheck-all-patmat"
Scala 2的许多标志在Scala 3中不起作用。
migration notes Scala 2 -> 3
more on Scala 3 compiler flags
nhaq1z214#
也许你可以设置一个默认的case来捕获后定义的元素,并将其绑定到一个你可以单独管理的partial函数。那么这个分部将作为一个“默认处理程序”。
或者你也可以使用PartialFunctions并将它们链接在一起。