2013-04-27 2 views
1

Почему for {i <- (1 to 1000000000)} println(i) дает мне OutOfMemoryError, но (1 to 1000000000) foreach println нет? Что делать, если я должен использовать синтаксис for-loop, что мне делать?Scala for-loop range OutOfMemoryError

+0

для цикла выделяет 10^9 Интс – pathikrit

+0

Какая версия Скале это связано? –

ответ

2

Два фрагмента почти эквивалентны. for синтаксис в scala разыгрывается компилятором в приложениях foreach, flatmap, withFilter, а также map (если вы используете yield). Эту информацию можно найти в разделе 6.19 раздела scala language specification.

Это означает, что цикл for

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

становится обессахаренная в

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

, который почти эквивалентен

(1 to 1000000000) foreach println 

Ни один из фрагментов должен вызвать OutOfMemoryError. Вы можете посмотреть на перегруженном определении foreach для Range с в источниках:

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

Существует только один индекс переменный, который мутировал в то время как цикл обработки.

Но полезно подтвердить, что нет дополнительного бокса/распаковки индекса 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 
Смежные вопросы