WartRemover's NonUnitStatements
要求不返回单位的语句必须具有作业。好的,但有时候我们必须使用恼人的Java API来变异并返回一个值,而且我们实际上并不关心返回的值。
所以我最终尝试了这个:
val _ = mutateSomething(foo)
但是如果我有多个这些,_
实际上是一个已被分配的合法值,所以我无法重新分配。 Wartremover也会正确地告诫无偿使用var,因此我不能只做var _ =
。
我可以执行以下操作(需要;
以避免Scala认为它是一个继续定义,除非我每次执行此操作时都添加完整的换行符。)
;{val _ = mutateSomething(foo)}
有更好的方法吗?
答案 0 :(得分:4)
我对linting工具的一般想法是你不应该通过箍来满足它们。
重点是让你的代码更好,既有更少的bug,也有风格。但只是分配给var _ =
并不能实现这一目标。我首先要确定我真的不关心返回值,甚至断言它不是我期望的那样。如果我不这样做,我只会添加一个@SuppressWarnings(Array("org.wartremover.warts.NonUnitStatements"))
,也许可以评论一下为什么以及完成它。
Scala有点独特,因为它是一种有点固执己见的语言,也试图与另一种不那么自以为是的语言整合。这导致痛点。处理这个问题有不同的理念,但我倾向于没有出汗,只是意识到并试图隔离边界。
答案 1 :(得分:4)
我正在发布一个答案,但真正的归功于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 _ = ... }
解决方案不同,它看起来更好,也可以在块的开头工作而无需改变样式(;
不能在块的开头出现,它必须在发表声明之后)。