WartRemover的NonUnitStatements
要求不返回单元的语句必须具有赋值。好吧,但有时我们必须使用烦人的 Java API,它们既会变异又返回一个值,而且我们实际上几乎从不关心返回的值。
所以我最终尝试了这个:
val _ = mutateSomething(foo)
但是,如果我有多个这样的,_
实际上是一个已分配给的合法值,所以我无法重新分配。Wartremover也会理所当然地告诫无端的var使用,所以我不能只做var _ =
.
我可以执行以下操作(需要;
以避免 Scala 认为它是一个延续定义,除非我每次这样做时都添加一个完整的换行符(。
;{val _ = mutateSomething(foo)}
有没有更好的方法?
我对 linting 工具的一般想法是,您不应该跳过箍来满足它们。
关键是要让你的代码更好,既有更少的错误,又有风格上的。但仅仅分配给var _ =
并不能实现这一目标。我首先确定我真的真的不关心返回值,甚至不断言它是我期望的。如果我不这样做,我只会添加一个@SuppressWarnings(Array("org.wartremover.warts.NonUnitStatements"))
,也许还有一个关于为什么的评论,并完成它。
Scala的独特之处在于它是一种有点固执己见的语言,它也试图与另一种不那么固执己见的语言集成。这会导致痛点。处理这个问题有不同的哲学,但我倾向于不出汗,只是意识到并尝试隔离界限。
我正在发布一个答案,但真正的功劳要归功于 Shane Delmore 指出这一点:
def discard(evaluateForSideEffectOnly: Any): Unit = {
val _: Any = evaluateForSideEffectOnly
() //Return unit to prevent warning due to discarding value
}
或者(或请参阅下面的@som-snytt的评论(:
@specialized def discard[A](evaluateForSideEffectOnly: A): Unit = {
val _: A = evaluateForSideEffectOnly
() //Return unit to prevent warning due to discarding value
}
然后像这样使用它:discard{ badMutateFun(foo) }
.
与;{ val _ = ... }
解决方案不同,它看起来更好,并且也可以在块的开头工作,而无需更改样式(;
不能出现在块的开头,它必须在语句之后出现(。