【问题标题】:Is there a way to suppress *only* exhaustiveness checking in Scala?有没有办法在 Scala 中抑制 *only* 详尽检查?
【发布时间】:2021-05-06 22:38:14
【问题描述】:

我发现自己经常写这样的代码:


thing match {
   case Case1 ...
   case Case2 ...
   case _ => throw new IllegalStateException(s"unexpected $thing")
}

有时我想要当案例不匹配时出现运行时错误。案例是一种断言。

有没有更好的方法来抑制穷举检查?

我不想使用[@unchecked](https://www.scala-lang.org/api/2.12.1/scala/unchecked.html),因为这也会禁用可达性检查,我确实想要。

【问题讨论】:

  • 我个人认为你拥有它的方式更好,因为至少你可以设置一个更好的例外。如果您想减少样板文件,您可以使用部分函数编写自己的帮助程序。
  • 你的做法有什么问题?
  • @texasbruce 这是很多重复,我每次都必须做// $COVERAGE_OFF// $COVERAGE_ON。我正在开发一个编译器,并且对 AST 有一定的期望,所以如果我的假设是错误的,我想尽快崩溃。让糟糕的 AST 无法表示似乎不值得,因为无论如何大型测试套件都会捕获意外的 AST。

标签: scala pattern-matching


【解决方案1】:

你可以使用nowarn注解来隐藏警告:

import scala.annotation.nowarn

@nowarn("msg=not.*?exhaustive")
val r = thing match {
   case Case1 ...
   case Case2 ...
}

它是在 Scala 2.13.2 中添加的,因此如果您使用的是旧版本,则需要使用 silencer 插件。

或者,您可以使用消音器插件设置global regex-based suppresion

【讨论】:

  • 谢谢,我试了一下。不过,我认为这不是一个好的解决方案,因为检查仍在进行中。我仍然收到很多警告:Exhaustivity analysis reached max recursion depth, not all missing cases are reported. 和(更重要的是!)缓慢的编译时间。如果我添加包罗万象的条款,这两者都会消失
  • 你确定这不是另一个问题吗?请检查此scastie,它表明使用nowarn 会使警告消失,但当然,仅针对这种特殊情况,您显示了。
  • 要抑制其他警告,您需要尝试调整 nowarn 中的正则表达式。
  • 无论如何运行检查然后用正则表达式抑制它们并不是我想要的:检查可能会变得非常昂贵:对于一个小项目,它们的编译时间几乎是原来的两倍我添加了包罗万象的条款。
  • 更新:@nowarn 已向后移植到 2.12.13 github.com/scala/scala/releases/tag/v2.12.13
猜你喜欢
  • 2010-09-16
  • 1970-01-01
  • 2017-12-25
  • 1970-01-01
  • 2010-10-28
  • 2013-12-13
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多