我在使用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永远不会被执行!你知道为什么吗?
答案 0 :(得分:3)
已执行,而不是在您认为应该执行时。
为什么会这样?因为首先在集合中创建范围,然后使用该集合。
特别是,for循环中的x = y
会被转换为.map(x => (x,y))
,而Range
在评估地图时并不是懒惰的。