我在使用 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 永远不会执行!你知道为什么吗?
最佳答案
它被执行,只是不是在你认为应该执行的时候执行。
- i = 0
- jrange = 矢量(2, 4)
- i = 1
- jrange = 矢量(2, 4, 6)
- j = 2
- j = 4
- j = 2
- j = 4
- j = 6
为什么会发生这种情况?因为范围首先在集合中创建,然后使用该集合。
特别是,for 循环中的 x = y
会被转换为 .map(x => (x,y))
和 Range
code> 对 map 的评估并不懒惰。
关于scala for 循环很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21330006/