2014-01-24 125 views
2

我遇到了一個奇怪的錯誤使用for循環。斯卡拉for循環奇怪

var verbose = true 

for(i <- 0 to 1; 
    dummy = (if(verbose) println(s"i = $i") else()); 
    jrange = (if(i==0) 1 to 5 else 1 to 7).filter(_%2 == 0); 
    dummy2 = (if(verbose) println(s"jrange = $jrange") else()); 
    j <- jrange; 
    dummy3 = (if(verbose) println(s"j = $j") else()); 
    k <- List() 
    ) println("looping") 

顯示:

i = 0 
jrange = Vector(2, 4) 
i = 1 
jrange = Vector(2, 4, 6) 
j = 2 
j = 4 
j = 2 
j = 4 
j = 6 

這是奇怪的事情是,永遠不會執行第三的println當我== 0!你知道爲什麼嗎?

+0

它正好在輸出中,'j = 2'和'j = 4'。或者你的意思是第四個'println'?你沒有顯示那個輸出。 –

回答

3

執行,只是當你認爲它應該是。

  1. I = 0
  2. jrange =矢量(2,4)
  3. I = 1
  4. jrange =矢量(2,4,6)
  5. J = 2
  6. j = 4
  7. j = 2
  8. j = 4
  9. j = 6

爲什麼會發生這種情況?因爲範圍首先在集合中創建,然後使用該集合。

特別是,for循環中的x = y被翻譯爲.map(x => (x,y)),並且Range在其對地圖的評估中並不懶惰。

+0

謝謝!通過在範圍中添加「.view」,我可以讓所有事情都變得懶惰。 –