在 SBT 中 Non-Exhaustive 匹配时编译失败
Make Compile Fail on Non-Exhaustive Match in SBT
假设我有一个特征,Parent,有一个 child,Child。
scala> sealed trait Parent
defined trait Parent
scala> case object Boy extends Parent
defined module Boy
我编写了一个函数,该函数在密封特征上进行模式匹配。我的 f
函数是 总计 因为只有一个 Parent
实例。
scala> def f(p: Parent): Boolean = p match {
| case Boy => true
| }
f: (p: Parent)Boolean
然后,2 个月后,我决定添加 Girl
child 个 Parent
。
scala> case object Girl extends Parent
defined module Girl
然后 re-write 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
如果我遇到 non-exhaustive 匹配项,那么我会收到 compile-time 警告(正如我们在这里看到的)。
但是,如何在 non-exhaustive 匹配项上使编译 失败 ?
您可以将 -Xfatal-warnings
添加到 Scalac 的选项中。这样任何警告都将被视为错误。
在 sbt 中,您可以通过以下方式实现:
scalacOptions += "-Xfatal-warnings"
也许您可以放入一个默认案例来捕获 post 定义的元素并将其绑定到您可以单独管理的部分函数。然后部分将充当 "default handler".
sealed trait Animal
case class Dog(name: String) extends Animal
case class Cat(name: String) extends Animal
val t: Animal = Dog("fido")
// updates when the trait updates
val partial = PartialFunction[Animal, Unit] {
case Dog(_) => println("default dog")
case Cat(_) => println("default cat")
case _ => throw new RuntimeException("Broken")
}
// matches that may be out of date refer to it
t match {
case Dog(_) => println("specific dog")
case t => partial(t)
}
或者您可以一直使用 PartialFunctions 并将它们链接在一起。
从 scalac 2.13.2 开始,对警告进行了相当精细的控制。要获得 OP 的要求:
scalacOptions += "-Wconf:cat=other-match-analysis:error"
假设我有一个特征,Parent,有一个 child,Child。
scala> sealed trait Parent
defined trait Parent
scala> case object Boy extends Parent
defined module Boy
我编写了一个函数,该函数在密封特征上进行模式匹配。我的 f
函数是 总计 因为只有一个 Parent
实例。
scala> def f(p: Parent): Boolean = p match {
| case Boy => true
| }
f: (p: Parent)Boolean
然后,2 个月后,我决定添加 Girl
child 个 Parent
。
scala> case object Girl extends Parent
defined module Girl
然后 re-write 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
如果我遇到 non-exhaustive 匹配项,那么我会收到 compile-time 警告(正如我们在这里看到的)。
但是,如何在 non-exhaustive 匹配项上使编译 失败 ?
您可以将 -Xfatal-warnings
添加到 Scalac 的选项中。这样任何警告都将被视为错误。
在 sbt 中,您可以通过以下方式实现:
scalacOptions += "-Xfatal-warnings"
也许您可以放入一个默认案例来捕获 post 定义的元素并将其绑定到您可以单独管理的部分函数。然后部分将充当 "default handler".
sealed trait Animal
case class Dog(name: String) extends Animal
case class Cat(name: String) extends Animal
val t: Animal = Dog("fido")
// updates when the trait updates
val partial = PartialFunction[Animal, Unit] {
case Dog(_) => println("default dog")
case Cat(_) => println("default cat")
case _ => throw new RuntimeException("Broken")
}
// matches that may be out of date refer to it
t match {
case Dog(_) => println("specific dog")
case t => partial(t)
}
或者您可以一直使用 PartialFunctions 并将它们链接在一起。
从 scalac 2.13.2 开始,对警告进行了相当精细的控制。要获得 OP 的要求:
scalacOptions += "-Wconf:cat=other-match-analysis:error"