2

WartRemover NonUnitStatements要求不返回单元的语句必须有赋值。好的,但有时我们不得不使用既会变异又会返回值的恼人的 Java API,而我们实际上几乎不关心返回值。

所以我最终尝试了这个:

val _ = mutateSomething(foo)

但是,如果我有多个,_实际上是已分配给的合法 val,因此我无法重新分配。Wartrremover 也会正确地警告无偿使用 var,所以我不能这样做var _ =

我可以执行以下操作(需要;避免 Scala 认为这是一个继续定义,除非我每次都添加一个完整的换行符)。

;{val _ = mutateSomething(foo)}

有没有更好的办法?

4

2 回答 2

6

我对 linting 工具的一般看法是,你不应该为了满足它们而跳槽。

关键是要让你的代码更好,同时减少错误和风格。但仅仅分配给var _ =并不能实现这一点。我首先要确定我真的不关心返回值,甚至不断言它是我所期望的。如果我不这样做,我会添加一个@SuppressWarnings(Array("org.wartremover.warts.NonUnitStatements"))关于为什么并完成它的评论。

Scala 有点独特,因为它是一种有点自以为是的语言,它还试图与另一种不太自以为是的语言集成。这会导致痛点。处理这个问题有不同的哲学,但我倾向于不费吹灰之力,只是意识到并尝试隔离界限。

于 2017-06-22T01:10:02.287 回答
5

我发布了一个答案,但真正归功于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 _ = ... }解决方案不同,它看起来更好,并且在块的开头也可以工作而无需更改样式(a;不能出现在块的开头,它必须在语句之后)。

于 2017-06-22T03:15:18.730 回答