scala SBT中非穷举匹配导致编译失败

vof42yt1  于 12个月前  发布在  Scala
关注(0)|答案(4)|浏览(143)

假设我有一个特质,父母,和一个孩子,孩子。

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个月后,我决定添加ParentGirl子节点。

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

如果我遇到一个非穷举匹配,那么我会得到一个编译时警告(如我们在这里看到的)。
但是,如何在非穷举匹配上使编译失败

r1wp621o

r1wp621o1#

您可以将-Xfatal-warnings添加到Scalac的选项中。这样,任何警告都将被视为错误。
在sbt中,您可以通过以下方式实现:

scalacOptions += "-Xfatal-warnings"
ogsagwnx

ogsagwnx2#

从scalac 2.13.2开始,警告的控制变得相当精细。得到OP要求的内容:

scalacOptions += "-Wconf:cat=other-match-analysis:error"

Detailed howto by Lukas Rytz.

btqmn9zl

btqmn9zl3#

Sbt和Scala3的编译器标志:
scalacOptions += "-Ycheck-all-patmat"
Scala 2的许多标志在Scala 3中不起作用。
migration notes Scala 2 -> 3
more on Scala 3 compiler flags

nhaq1z21

nhaq1z214#

也许你可以设置一个默认的case来捕获后定义的元素,并将其绑定到一个你可以单独管理的partial函数。那么这个分部将作为一个“默认处理程序”。

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并将它们链接在一起。

相关问题