我注意到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
答案 0 :(得分:4)
我的猜测是transactions
不是像List
或Array
这样的常规集合 - 它可能代表了未来的一些计算,例如Future
或某种流。
如果是这样,传递给transactions.foreach
的函数很可能是异步运行的(即稍后,有时在不同的线程上,通常不会阻塞调用线程)。
遵循此假设,您对transactions.foreach
的调用导致某些工作“在后台”发生,但ranges.foreach
仍在继续,不间断。 ranges.foreach
可能会完成,然后由transactions.foreach
触发的工作最终会开始运行,因此您最终会获得所有2
。
那就是说,这似乎是一个异常情况。如果ranges
和transactions
是常规集合(如List
),则会看到与常规Java集合相同的循环行为。
答案 1 :(得分:1)
您对ranges
和transactions
的定义肯定存在问题,请注意foreach
调用不等同于Java的for-loop
,foreach
打算迭代集合。如果您尝试关注代码段(在某种意义上相当于您的for-loop
),那么您将看到所需的结果:
scala>
(1 to 2).foreach { i1 =>
println("1loop")
(1 to 2).foreach { i2 =>
println("2loop")
}
}
1loop
2loop
2loop
1loop
2loop
2loop
希望有所帮助