在2.7.5.final上,我尝试像这样添加Int的Iterable列表

def sum(xs: Iterable[Int]): Long = {
  var sum = 0L
  xs.foreach((x) => sum = sum + x)
  sum
}

println(sum(List(1, Integer.MAX_VALUE - 1)))
println(sum(Integer.MAX_VALUE - 1 to Integer.MAX_VALUE))
println(0L + Integer.MAX_VALUE - 1 + Integer.MAX_VALUE)

当我运行时,我得到
2147483647
0
4294967293

而且,您可能会说“use reduceLeft(_ + _)”,但是它似乎只能返回与列表中元素相同的类型...但是我想累加为Long,所以我没有溢出问题。

更新2009-10-28

正如Eastsun所指出的,这是Range中的一个错误。已经在ticket 2535中报告给Scala团队

最佳答案

这是Range的错误。
有Range的foreach方法的源代码:

override def foreach(f: Int => Unit) {
if (step > 0) {
  var i = this.start
  *val until = if (inInterval(end)) end + 1 else end*      //bug here!!!

  while (i < until) {
    f(i)
    i += step
  }
} else {
  var i = this.start
  val until = if (inInterval(end)) end - 1 else end

  while (i > until) {
    f(i)
    i += step
  }
}

}

关于Scala:尽管在添加时使用Long也会溢出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1635094/

10-11 22:31
查看更多