4

下面的代码打印 0,1,2,3,4,5,6,7,8,9

for (i <- 0 until 10) {
    println(i) 

var 'i' 是如何递增的?我怀疑发生了一些隐含的事情,但检查了“直到”的签名,它返回了一个我不知道这是什么的范围?

4

4 回答 4

11

for在 scala 中不是一个循环,而是一个叫做 a 的东西comprehension。在您的情况下,它只是调用Range.foreach,因为0 until 10创建一个Range. 然后它只是为范围内的每个值递归调用您传递给 foreach 的函数。

编辑

根据您的for外观,它将创建对map, flatMap, foreach, filter...的嵌套调用

例如:

for {
  x <- 0 until 10
  y <- 0 until 10
} yield x * y

将编译为

(0 until 10) flatMap { x =>
  (0 until 10) map { y =>
    x*y
  }
}

for {
  x <- 0 until 10
  if x % 2 == 0
} yield x * 2

将被编译成类似

(0 until 10).filter { x =>
  x % 2 == 0
}.map { x =>
  x * 2
}
于 2013-01-10T15:24:33.030 回答
6

for被解释为foreachScala 中集合的方法。所以真正执行的是

(0 until 10) foreach { i => println(i) }

正如您所提到的,until它接受 2 个整数并返回 a Range,它是一个序列 {0,1,2,...,9}。您的程序会遍历这 10 个数字中的每一个并println对其应用函数。一句话,底层实现for是函数式编程风格,不需要做增量。

于 2013-01-10T15:23:32.443 回答
3

0 到 10 定义一个范围。

for 理解扩展为以下内容:

(0 until 10) foreach { println(_) }

其中,范围扩大后类似于:

(Seq(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)) foreach { println(_) }
于 2013-01-10T15:23:01.620 回答
0

until是一种方法 - 以中缀表示法调用 - 返回一个Range. for外观基本上是对 this 的迭代Range。这是同一事物的不同表示法:

0.until(10).foreach(println(_))
于 2013-01-10T15:25:08.307 回答