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