2014-01-24 171 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”,我可以让所有事情都变得懒惰。 –