让我们打破它......
val a1: Range.Inclusive = (0 to 123456789)
val a2: AnyRef with SeqView[Int, IndexedSeq[Int]] = a1.view
val b1: Array[Int] = Array.range(0,123456789)
val b2: AnyRef with mutable.IndexedSeqView[Int, Array[Int]] = b1.view
的IntelliJ推断(按CTR-Q)其中,b1是一个数组。
让我们来看看该文档的 “Array.range” ......
/** Returns an array containing a sequence of increasing integers in a range.
*
* @param start the start value of the array
* @param end the end value of the array, exclusive (in other words, this is the first value '''not''' returned)
* @return the array with values in range `start, start + 1, ..., end - 1`
* up to, but excluding, `end`.
*/
def range(start: Int, end: Int): Array[Int] = range(start, end, 1)
错误是从那里你打电话Array.range
行来了...
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at scala.collection.mutable.ArrayBuilder$ofInt.mkArray(ArrayBuilder.scala:323)
at scala.collection.mutable.ArrayBuilder$ofInt.resize(ArrayBuilder.scala:329)
at scala.collection.mutable.ArrayBuilder$ofInt.sizeHint(ArrayBuilder.scala:334)
at scala.Array$.range(Array.scala:402)
at scala.Array$.range(Array.scala:390)
at pkg.Main$.main(Main.scala:57)
at pkg.Main.main(Main.scala)
你刚才分配的其中包含123456790个元素的数组,这就是为什么您得到“java.lang.OutOfMemoryError:Java堆空间”错误。
因此,如果我理解正确,Scala编译器是不够智能结合这两个步骤? – TNM
@TNM - 这不完全是“不够聪明”的情况,而是“做你所要求的”。编译器也无法做到这种组合(总的来说,无论如何,优化器会得到特殊情况),但在这种情况下,它不应该做任何不同的事情,因为大概你有一些很好的理由要求一个由数组支持的视图,而不是一个范围。 –