gpt4 book ai didi

scala - 在scala中警告或避免整数除法(导致截断)

转载 作者:行者123 更新时间:2023-12-04 15:53:47 25 4
gpt4 key购买 nike

考虑

 1 / 2

 val x: Int = ..
val n: Int = ..

x / n

这两者都等于 .. 0 .. 因为 整数除法 会导致截断。

另外:(这是我的典型用例):

val averageListSize =  myLists.map(_.length).sum()/myLists.length

当它发生在长时间计算的中间时,这让我很痛苦:第一个冲动是检查引入了哪些逻辑错误。只有经过一段时间的调试和摸索,真正的罪魁祸首才会出现。

有什么方法可以更清楚地暴露这种行为 - 例如警告或某些(我不知道的)语言设置或结构会提醒或避免这种间歇性情况?

最佳答案

据我所知,Scala 编译器似乎没有提供允许您发出警告的警告标志(文档 here)。

但是,如果您觉得值得付出努力,您可以使用 Scalafix并编写您自己的自定义规则来检测整数除法并报告有关它的警告。

以下是一个简短的规则示例,可以检测整数文字上的整数除法:

import scalafix.lint.{Diagnostic, LintSeverity}
import scalafix.patch.Patch
import scalafix.v1.{SemanticDocument, SemanticRule}

import scala.meta.inputs.Position
import scala.meta.{Lit, Term}

class IntDivision extends SemanticRule("IntDivision") {

override def fix(implicit doc: SemanticDocument): Patch =
doc.tree.collect({
case term @ Term.ApplyInfix((_: Lit.Int, Term.Name("/"), Nil, _: List[Lit.Int])) =>
Patch.lint(new Diagnostic {
override final val severity: LintSeverity = LintSeverity.Warning
override final val message: String = "Integer division"
override final val position: Position = term.pos
})
}).asPatch

}

当运行以下代码时:

object Main {
def main(args: Array[String]): Unit = {
println(1 / 2)
}
}

Scalafix 将产生以下警告:

[warn] /path/to/Main.scala:3:13: warning: [IntDivision] Integer division
[warn] println(1 / 2)
[warn] ^^^^^

关于scala - 在scala中警告或避免整数除法(导致截断),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55525855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com