scala中的嵌套循环

时间:2016-02-16 18:42:26

标签: scala

我注意到scala循环与java循环不同:

$(document).ready(function () {
    $('.carMenu').change(function(){
         console.log($('option:selected',$(this)).index());
    });
});

//java: for(int i = 0; i < 2; i ++){ System.out.println("1loop"); for(int i = 0; i < 2; i ++){ System.out.println("2loop"); } } // output: 1loop 2loop 2loop ...

Scala

为什么会这样?如何将这个嵌套循环重新排列为更像scala的样式?

ranges.foreach{ range_line =>
      print("1")
      transactions.foreach{ transaction_line =>
        print("2")       
      }
    }
//output 
111...22

2 个答案:

答案 0 :(得分:4)

我的猜测是transactions不是像ListArray这样的常规集合 - 它可能代表了未来的一些计算,例如Future或某种流。

如果是这样,传递给transactions.foreach的函数很可能是异步运行的(即稍后,有时在不同的线程上,通常不会阻塞调用线程)。

遵循此假设,您对transactions.foreach的调用导致某些工作“在后台”发生,但ranges.foreach仍在继续,不间断。 ranges.foreach可能会完成,然后由transactions.foreach触发的工作最终会开始运行,因此您最终会获得所有2

那就是说,这似乎是一个异常情况。如果rangestransactions是常规集合(如List),则会看到与常规Java集合相同的循环行为。

答案 1 :(得分:1)

您对rangestransactions的定义肯定存在问题,请注意foreach调用不等同于Java的for-loopforeach打算迭代集合。如果您尝试关注代码段(在某种意义上相当于您的for-loop),那么您将看到所需的结果:

    scala> 

    (1 to 2).foreach { i1 =>
      println("1loop")
      (1 to 2).foreach { i2 =>
        println("2loop")
      }
    }

    1loop
    2loop
    2loop
    1loop
    2loop
    2loop

希望有所帮助