Throwaway值 - Scala中的最佳实践是什么?

时间:2017-06-22 00:59:58

标签: scala scala-wartremover

WartRemover's NonUnitStatements要求不返回单位的语句必须具有作业。好的,但有时候我们必须使用恼人的Java API来变异并返回一个值,而且我们实际上并不关心返回的值。

所以我最终尝试了这个:

val _ = mutateSomething(foo)

但是如果我有多个这些,_实际上是一个已被分配的合法值,所以我无法重新分配。 Wartremover也会正确地告诫无偿使用var,因此我不能只做var _ =

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

;{val _ = mutateSomething(foo)}

有更好的方法吗?

2 个答案:

答案 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 _ = ... }解决方案不同,它看起来更好,也可以在块的开头工作而无需改变样式(;不能在块的开头出现,它必须在发表声明之后)。