下面的代码打印 0,1,2,3,4,5,6,7,8,9
for (i <- 0 until 10) {
println(i)
var 'i' 是如何递增的?我怀疑发生了一些隐含的事情,但检查了“直到”的签名,它返回了一个我不知道这是什么的范围?
下面的代码打印 0,1,2,3,4,5,6,7,8,9
for (i <- 0 until 10) {
println(i)
var 'i' 是如何递增的?我怀疑发生了一些隐含的事情,但检查了“直到”的签名,它返回了一个我不知道这是什么的范围?
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
}
for
被解释为foreach
Scala 中集合的方法。所以真正执行的是
(0 until 10) foreach { i => println(i) }
正如您所提到的,until
它接受 2 个整数并返回 a Range
,它是一个序列 {0,1,2,...,9}。您的程序会遍历这 10 个数字中的每一个并println
对其应用函数。一句话,底层实现for
是函数式编程风格,不需要做增量。
0 到 10 定义一个范围。
for 理解扩展为以下内容:
(0 until 10) foreach { println(_) }
其中,范围扩大后类似于:
(Seq(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)) foreach { println(_) }
until
是一种方法 - 以中缀表示法调用 - 返回一个Range
. for
外观基本上是对 this 的迭代Range
。这是同一事物的不同表示法:
0.until(10).foreach(println(_))