爲什麼for {i <- (1 to 1000000000)} println(i)
給我OutOfMemoryError但是(1 to 1000000000) foreach println
不是?如果我必須使用for-loop語法,該怎麼辦?Scala for-loop範圍OutOfMemoryError
1
A
回答
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。你可以看看的foreach
爲Range
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
相關問題
- 1. scala範圍長
- 2. Forloop計數器與動態值範圍
- 3. Scala:對象範圍
- 4. 範圍查詢期間的Cassandra OutOfMemoryError
- 5. Scala類型參數範圍
- 6. Scala中的Random.nextDouble的範圍是什麼?
- 7. 爲scala設置int的具體範圍
- 8. Scala範圍包含(elem:Any)方法
- 9. Scala的隱式轉換範圍發出
- 10. scala範圍split缺少最後一個
- 11. Scala的變量範圍問題
- 12. 給定一個範圍,在Scala中獲取該範圍內的所有日期
- 13. 在日期範圍範圍
- 14. OndemandGrid範圍和X範圍
- 15. Angularjs:$範圍vs範圍
- 16. 範圍seekbar設置範圍
- 17. 創建範圍的名單
- 18. 座的範圍,功能範圍和本地範圍在Javascript
- 19. 孩子範圍到家長範圍不同的孩子範圍
- 20. 範圍
- 21. 範圍
- 22. 範圍
- 23. 範圍
- 24. 範圍
- 25. 範圍
- 26. 範圍?
- 27. 在Eclipse中測試Scala代碼覆蓋範圍
- 28. 是否有可能在Scala中創建一個「受限範圍」?
- 29. 查看範圍導致scala內存不足的錯誤
- 30. scala參與者無法在並行範圍內工作
for循環分配10^9個整數 – pathikrit 2013-04-27 10:40:03
什麼版本的Scala的是這個相關? – 2013-04-27 20:23:04