Scala - Loops

2016-04-17  本文已影响38人  pangolulu

下面给出一个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 ()

这里需要注意:

  1. conditioncommand需要按照call-by-name的方式来传,这样才能在每一次迭代中都能进行evaluate。
  2. WHILE函数是尾递归的,所以调用WHILE只需要使用常量的栈大小。

对于for循环,Scala可以这么写:

for (i <- 1 until 3) { System.out.print(i + " ") }

for循环的翻类似于对for-expression的翻译,但是使用的是foreach函数,而不是mapflatMap
在每个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)))
上一篇下一篇

猜你喜欢

热点阅读