一个不详尽的匹配,例如
def foo[A](t: Seq[A]) = t match {
Seq(x) => x
}
通常(并非总是,但通常)是我的一个错误,会在运行时崩溃。Scala 发出警告,但在增量构建中,该文件可能已经编译,所以我会错过警告。
有没有办法,无论是全局的还是局部的,也许是通过注释,来强制 scala 将警告变成错误?
一个不详尽的匹配,例如
def foo[A](t: Seq[A]) = t match {
Seq(x) => x
}
通常(并非总是,但通常)是我的一个错误,会在运行时崩溃。Scala 发出警告,但在增量构建中,该文件可能已经编译,所以我会错过警告。
有没有办法,无论是全局的还是局部的,也许是通过注释,来强制 scala 将警告变成错误?
可以提供一个自定义报告器,将警告任意报告为错误(或相反),但 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
考虑询问有关您的构建过程的问题。
您应该在代码提交/签入之前立即进行完整、干净的构建(而不是增量)并运行单元测试。这是为了避免 SBT 或构建过程中的(潜在的、剩余的)错误。当然,您应该监控结果中的错误和警告。
你是否,或者你应该,做持续集成(自动的、预定的构建/测试)?在此期间,您可能拥有或引入对如何处理警告的一些控制(忽略或触发构建失败/警告)。
我看不到scalac
从命令行执行此操作的方法。如果所有其他方法都不能满足您的需求,那么考虑作为最后的手段,并且只有在适合您的构建工具的情况下:为 . 创建一个包装脚本scalac
,也命名为scalac
:
scalac