下面的代码打印0,1,2,3,4,5,6,7,8,9
for (i <- 0 until 10) {
println(i)
var'i'如何递增?我怀疑有一些隐含的事情,但检查'until'的签名返回一个Range我不知道这是什么?
答案 0 :(得分:11)
for
不是循环,而是称为comprehension
。在您的情况下,它只需调用Range.foreach
,因为0 until 10
会创建Range
。然后,它只是递归调用您传递给foreach的函数,用于范围中的每个值。
修改强>:
根据for
看起来的确切程度,它会创建对map
,flatMap
,foreach
,filter
...
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
是一种方法 - 以中缀表示法调用 - 返回Range
。 for
外观基本上是对此Range
的迭代。这是同一事物的另一种表示法:
0.until(10).foreach(println(_))