scala for 循环很奇怪

标签 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. 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 code> 对 map 的评估并不懒惰。

关于scala for 循环很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21330006/

相关文章:

scala - 我可以从外部方法遍历 KTable 中的项目吗

scala - 带有命令行参数的 bash 与 scala.sys.process.Process

java - Scala 是否对小型集合使用特殊实现?

c++ - 有没有办法在 for 循环初始值设定项中定义两种不同类型的变量?

c - 什么条件: '*s1 = *s2' do exactly?

scala - 偏函数类型

linux - 不要在 ls do 中执行文件

java - 如何查找一个数字是否在数组中?

arrays - Julia:在 for 循环中累积数组(循环局部范围的问题)

mysql - 在 MySQL 中修改数据库时,Spark 中删除了行