'i'变量如何在此循环中递增?

时间:2013-01-10 15:20:48

标签: scala

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

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

var'i'如何递增?我怀疑有一些隐含的事情,但检查'until'的签名返回一个Range我不知道这是什么?

4 个答案:

答案 0 :(得分:11)

scala中的

for不是循环,而是称为comprehension。在您的情况下,它只需调用Range.foreach,因为0 until 10会创建Range。然后,它只是递归调用您传递给foreach的函数,用于范围中的每个值。

修改

根据for看起来的确切程度,它会创建对mapflatMapforeachfilter ...

E.g:

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
}

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:3)

0到10定义范围。

for comprehension扩展为以下内容:

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

在扩展范围之后,类似于:

(Seq(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)) foreach { println(_) }

答案 3 :(得分:0)

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

0.until(10).foreach(println(_))