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



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

相关内容

  • 没有找到相关文章

最新更新