Scala for循环理解中的NumericRange Int大小限制背后是什么?是否有可能(不用太头痛)扩展“ for / Seqs” NumericRange以使用Long(或大于Int.MaxValue的任何值)?scala>
for (i: Long <- 0L to 10000000000) {}
java.lang.IllegalArgumentException: 0 to 10000000000L by 1: "seqs cannot contain more than Int.MaxValue elements."
at scala.collection.immutable.NumericRange$.count(NumericRange.scala:227)
at scala.collection.immutable.NumericRange.numRangeElements(NumericRange.scala:53)
at scala.collection.immutable.NumericRange.length(NumericRange.scala:55)
at scala.collection.immutable.NumericRange.foreach(NumericRange.scala:73)
at .<init>(<console>:19)
at .<clinit>(<console>)
at .<init>(<console>:11)
at .<clinit>(<console>)
at $print(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704)
at scala.tools.nsc.interpreter.IMain$Request$$anonfun$14.apply(IMain.scala:920)
at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:43)
at scala.tools.nsc.io.package$$anon$2.run(package.scala:25)
at java.lang.Thread.run(Thread.java:680)
-
提前致谢!
最佳答案
简短的回答-似乎是“功能”-至少,它按设计工作。
正如@drexin所指出的,“ to”的实现仅限于具有Int范围。然而...
问题是NumericRange [T] .count()、. numRangeElements和.length()返回一个Int-不管T是什么。在这种情况下,它是一个NumericRange [Long],将count()限制为31位,恕我直言,这似乎有点不对。
然而...
通过浏览Jira问题,这似乎正在按设计工作。参见例如SI-4370。但是为了确保从这个角度考虑了这一点,我输入了SI-5619。