Range.foreach以奇怪的顺序执行

时间:2014-03-23 22:10:26

标签: scala

我是Scala的新手,不知道这里发生了什么:

(1 to 2) foreach {
  println("+")
  v => { println(v) }
  println("-")
}

为什么打印以下内容?

+
1
-
2
-

我认为这与隐式创建的实例和作为构造函数执行的实体有关,这可以解释一次打印的+。但这并不能解释为什么在每次循环后打印-

对不起,如果这是一个愚蠢的问题。这只是一直在唠叨我。 Eclipse内部的调试执行并没有发现任何有启发性的东西。

并添加问题:为什么这有效?我已经明白foreach应该接受一个参数,一个函数,它接收一个Int并返回,嗯..某事。

1 个答案:

答案 0 :(得分:2)

我相信它是这样解释你的代码:

(1 to 2) foreach {
  println("+")
  v => {{ println(v) }
    println("-")
  }
}

澄清 - foreach接受迭代类型的单个参数(因此,在这种情况下为Int)并运行作为参数传递给该值的函数。在这种情况下,在构造所述函数期间调用第一个println。然后,编译器必须将函数的其余部分解释为以下形式:

v: Int => Unit

这正是它在你的情况下的作用,你放一套额外的括号不会改变它,你可以很容易地做到:

(1 to 2) foreach {
  println("+")
  v => println(v)
    println("-")
}