2013-04-27 63 views
1

爲什麼for {i <- (1 to 1000000000)} println(i)給我OutOfMemoryError但是(1 to 1000000000) foreach println不是?如果我必須使用for-loop語法,該怎麼辦?Scala for-loop範圍OutOfMemoryError

+0

for循環分配10^9個整數 – pathikrit 2013-04-27 10:40:03

+0

什麼版本的Scala的是這個相關? – 2013-04-27 20:23:04

回答

2

這兩個片段幾乎相同。 for scala中的語法被編譯器解密爲foreach,flatmap,withFilter以及map(如果使用yield)的應用程序。這些信息可以在scala language specification的第6.19節找到。

這意味着for

for (i <- 1 to 1000000000) println(i) 

變得脫糖成

(1 to 1000000000).foreach { case i => println(i) } 

這幾乎等同於

(1 to 1000000000) foreach println 

無論是片段的應引起一個OutOfMemoryError。你可以看看的foreachRange S上的重載定義來源:

https://github.com/scala/scala/blob/v2.10.1/src/library/scala/collection/immutable/Range.scala#L135

只有1,而循環處理該突變索引變量。

但是確認索引int沒有多餘的裝箱/拆箱很有用。事實證明,沒有,雖然堆棧跟蹤到那裏是兩種形式稍有不同:

Predef$.println(Object) line: 287 
ForTest$$anonfun$f$1.apply$mcVI$sp(Int) line: 5 
Range.foreach$mVc$sp(Function1) line: 141 
ForTest$.f() line: 5 

Predef$.println(Object) line: 287 
ForTest$$anonfun$g$1.apply(Object) line: 6 
ForTest$$anonfun$g$1.apply(Object) line: 6 // boxing here 
Function1$class.apply$mcVI$sp(Function1, Int) line: 39 
AbstractFunction1.apply$mcVI$sp(Int) line: 12 
Range.foreach$mVc$sp(Function1) line: 141 
ForTest$.g() line: 6