scala for loop奇怪

时间:2014-01-24 10:16:20

标签: scala for-loop

我在使用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

奇怪的是,当i == 0时,第三个println永远不会被执行!你知道为什么吗?

1 个答案:

答案 0 :(得分:3)

已执行,而不是在您认为应该执行时。

  1. i = 0
  2. jrange = Vector(2,4)
  3. i = 1
  4. jrange = Vector(2,4,6)
  5. j = 2
  6. j = 4
  7. j = 2
  8. j = 4
  9. j = 6
  10. 为什么会这样?因为首先在集合中创建范围,然后使用该集合。

    特别是,for循环中的x = y会被转换为.map(x => (x,y)),而Range在评估地图时并不是懒惰的。