内建控制结构之while循环

Scala的while循环与其他语言一致。包括状态判断和循环体,只要状态保持真,循环体就一遍遍被执行,如:

package scala
object ScalaTest {
    def main(args:Array[String]):Unit = {
        var a = 1
        wile(a <= 10) {
            println("循环: " + a)
            a += 1
        }
    }
}

Scala同样也有do-while循环,它与while循环基本没有区别,只是把状态检查移到了循环体之后(唯一的区别是,do-while必须执行循环体一次)。如例:

package scala
object ScalaTest {
    def main(args:Array[String]):Unit = {
        var a = 1
        do{
            println("循环: " + a)
            a += 1
        }while(a <= 10)
    }
}

whiledo-while结构之所以被称为“循环”,而不是表达式,是因为它们不能产生有意义的结果。结果的类型是Unit,是表明存在并且唯一存在类型为unit的值,称为unit value,写成 (),()的存在是scala的unit不同于java的void的地方。如下例:

package scala
object ScalaTest {
    def main(args:Array[String]):Unit = {
        println("Unit方法返回值与()比较是不是相等: " + (greet() == ()))
    }
    def greet(){
        println("HI")
    }
}

结果为:

HI
Unit方法返回值与()比较是不是相等:true

示例确认:比较greet的结果和unit值()的相等性,可以得到返回true。

另外,对var再赋值等式本身也是unit值,这是另一种与此相类似的架构。如例:

package scala
object ScalaTest {
    def main(args:Array[String]):Unit = {
        var flag = "N"
        if((flag = space) == ()) println("YES") else println("NO")    //注意这句
    }
    def space() = ""
}

编译这段代码时,scala会警告你使用==比较类型为Unit和()将永远返回true。Scala的赋值语句只能得到Unit值(),因此赋值语句“flag = space()”的值将永远返回()。
由于while循环不产生值,因此它经常被纯函数式语言所舍弃这种语言只有表达式,没有循环。尽管如此,scala仍然包含了while循环,因为有些时候指令式的解决方案更容易读懂,尤其是对那些以指令式背景为主导的程序员来说尤其如此。
通过情况下,我们建议你质疑对while循环的使用如同质疑对var的使用那样。实际上,while循环和var经常是结对出现的。因为while循环不产生值,为了让程序发挥作用,while循环通常不是更新var就是执行I/O。我们建议你在代码中更为审慎地使用while循环。如果对某个while或do-while循环没有非用不可的理由,那么请尝试试用别的方式实现同样的功能

你可能感兴趣的:(scala)