【问题标题】:Can I force scala to error on an inexhaustive match?我可以强制 scala 在不详尽的比赛中出错吗?
【发布时间】:2013-07-06 02:14:47
【问题描述】:

不详尽的匹配,例如

def foo[A](t: Seq[A]) = t match {
    Seq(x) => x
}

通常(不总是,但通常)我的错误会在运行时崩溃。 Scala 发出警告,但在增量构建中,文件可能已经编译,所以我会错过警告。

有没有办法,无论是全局的还是本地的,也许是通过注释,来强制 scala 将警告变成错误?

【问题讨论】:

  • 我觉得你的例子总会报错...
  • 我不知道你是否要求 -Xfatal-warnings
  • @som-snytt 啊我不知道 -Xfatal-warnings。如果无法针对此特定警告,那将是朝着正确方向迈出的一步。
  • 我想知道为什么这不是编译器错误,但不必使用-Xfatal-warnings
  • @DhruvKapoor 可能有时编译器无法评估完整性(当涉及提取器时)和不完整匹配可能有用(x sliding 2 map { case Seq(a, b) => }

标签: scala compiler-errors warnings


【解决方案1】:

可以提供一个自定义报告器,将警告任意报告为错误(或相反),但 API 当前是基于字符串的,因此它会过滤字符串消息而不是键入的警告。

没有针对特定警告失败的内置方法,但-Xlint -Xfatal-warnings 是升级警告的常用方法。

已请求禁止警告,但被视为危险。对于致命警告,要求是抑制被认为是良性的警告。

如果您有剩余的弃用,可以通过从弃用的方法调用它来抑制警告(在 -Xfatal-warnings 下会失败);如果该方法是本地的,则不会产生警告。

scala> @deprecated("","") def f = 8
f: Int

scala> f
<console>:9: warning: method f is deprecated: 
              f
              ^
scala> object A {
     | def a = {
     | @deprecated("","") def _f = f
     | _f
     | }}
defined object A

scala> A.a
res1: Int = 8

本地弃用技巧本身已弃用,但您仍然可以使用转发伴侣:

scala> @deprecated("","") def f = 8
f: Int

scala> f
warning: there was one deprecation warning; re-run with -deprecation for details
res0: Int = 8

scala> @deprecated("","") class C { def g = f }; object C extends C
defined class C
defined object C

scala> C.g
res1: Int = 8

【讨论】:

  • 从那时起,他们“屈服”于局部警告抑制,并添加了 @nowarn 用于局部抑制和 -Wconf 用于全局策略。
【解决方案2】:

考虑询问有关您的构建过程的问题。

  1. 您应该在代码提交/签入之前立即进行完整、干净的构建(而不是增量)并运行单元测试。这是为了避免 SBT 或构建过程中的(潜在的、剩余的)错误。当然,您应该监控结果中的错误和警告。

  2. 您是否,或者您应该这样做,持续集成(自动的、预定的构建/测试)?在此期间,您可能拥有或引入对如何处理警告(忽略或触发构建失败/警告)的一些控制。

  3. 我看不到从scalac 命令行执行此操作的方法。如果所有其他方法都不能满足您的需求,那么考虑作为最后的手段,然后仅在适合您的构建工具时:为scalac 创建一个包装脚本,也命名为scalac

    • 调用真正的scalac
    • 监控输出:打印特定错误时返回错误,并可能删除目标类文件[从错误语句中捕获]以进一步强制问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-17
    • 2023-03-10
    • 2019-05-24
    • 2020-09-10
    • 1970-01-01
    • 2011-06-17
    • 2011-10-04
    • 1970-01-01
    相关资源
    最近更新 更多