根据scala-wartremover静态分析工具,我必须将"final"放在我创建的每个case类的前面:错误消息说"case classes必须是final".
根据scapegoat(Scala的另一个静态分析工具)而不是我不应该(错误消息:"案例类的冗余最终修饰符")
谁是对的,为什么?
我正在尝试将Wartremover添加到我的Play项目中,但它会在路径文件中报告疣,即使我将其排除.我正在使用Wartremover 0.14和Play Framework 2.4.6.
我的build.sbt中的相关部分:
wartremoverErrors ++= Warts.all
wartremoverExcluded += crossTarget.value / "routes" / "main" / "router" / "Routes.scala"
Run Code Online (Sandbox Code Playgroud)
(请注意,我必须采用与此问题中的答案不同的方式.)
如果没有该wartremoverExcluded
行,Wartremover会在路由文件中报告13个错误.有了它,它仍然报告两个:一个关于Wart.Var
和一个关于Wart.ExplicitImplicitTypes
.我也可以排除这些疣,但是使用Warts.allBut(Wart.Var, Wart.ExplicitImplicitTypes)
,但我不愿意,因为这排除了我整个代码库中的这些瑕疵,而不仅仅是路径文件.
有没有办法让Wartremover停止在路径文件中报告这些疣,而不排除每个文件的这些疣?
使用scala wart我得到:
def lastWithRecursion(input: Seq[Int]): Try[Int] = input match {
case head :: Nil => Success(head)
case _ :: tail => lastWithRecursion(tail)
case _ => Failure(new NoSuchElementException("No such element")) // how to avoid inferred type containing nothing.
}
Run Code Online (Sandbox Code Playgroud)
怎么避免inferred type containing nothing
?
WartRemover NonUnitStatements
要求不返回单元的语句必须具有赋值。好的,但有时我们不得不使用烦人的 Java API,它们会发生变化并返回一个值,而实际上我们几乎从不关心返回值。
所以我最终尝试了这个:
val _ = mutateSomething(foo)
Run Code Online (Sandbox Code Playgroud)
但是,如果我有多个这些,_
实际上是已分配给的合法 val,因此我无法重新分配。Wartremover 也会正确地警告无缘无故的 var-usage,所以我不能只是这样做var _ =
。
我可以执行以下操作(需要;
避免 Scala 认为它是一个继续定义,除非我每次都添加一个完整的换行符)。
;{val _ = mutateSomething(foo)}
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?