下面给出一个Scala中while循环的例子:
def power (x: Double, exp: Int): Double = {
var r = 1.0
var i = exp
while (i > 0) { r = r * x; i = i - 1 }
r
}
虽然在实际中不建议这么来写。
while
在Scala中是一个关键字,但是我们可不可以用一个函数来定义while呢?参考如下:
def WHILE(condition: => Boolean)(command: => Unit): Unit =
if (condition) {
command
WHILE(condition)(command)
}
else ()
这里需要注意:
-
condition
和command
需要按照call-by-name的方式来传,这样才能在每一次迭代中都能进行evaluate。 -
WHILE
函数是尾递归的,所以调用WHILE
只需要使用常量的栈大小。
对于for
循环,Scala可以这么写:
for (i <- 1 until 3) { System.out.print(i + " ") }
对for
循环的翻类似于对for-expression
的翻译,但是使用的是foreach
函数,而不是map
和flatMap
。
在每个collection中都定义了一个foreach
函数:
def foreach(f: T => Unit): Unit =
// apply ‘f‘ to each element of the collection
那么,对于如下的for
循环要怎么翻译呢?
for (i <- 1 until 3; j <- "abc") println(i + " " + j)
通过foreach
函数,可以展开为:
(1 until 3) foreach (i => "abc" foreach (j => println(i + " " + j)))