一次性值 - Scala 中的最佳实践是什么?

Throwaway values - what is the best practice in Scala?

WartRemover's NonUnitStatements 要求不是 returning 单元的语句必须有赋值。好的,但有时我们不得不使用烦人的 Java API,它们都会改变 return 一个值,而且我们实际上几乎不关心 returned 值。

所以我最终尝试了这个:

val _ = mutateSomething(foo)

但是如果我有多个这样的值,_ 实际上是一个已经分配给的合法值,所以我不能重新分配。 Wartremover 也会正确地警告无故使用 var,所以我不能只做 var _ =.

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

;{val _ = mutateSomething(foo)}

有没有更好的方法?

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

重点是让您的代码更好,既减少错误又在风格上。但是仅仅分配给 var _ = 并不能实现这一点。我首先要确定我真的不关心 return 值,甚至没有断言它是我期望的值。如果我不这样做,我会添加一个 @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 _ = ... } 解决方案不同,它看起来更好,并且在块的开头也可以工作而无需更改样式(; 不能出现在块的开头, 它必须在语句之后)。