W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
Scala 的 while 循環(huán)和其它語言如 Java 功能一樣,它含有一個條件,和一個循環(huán)體,只有條件滿足,就一直執(zhí)行循環(huán)體的代碼。比如下面的計算最大公因數(shù)的一個實現(xiàn):
def gcdLoop (x: Long, y:Long) : Long ={
var a=x
var b=y
while( a!=0) {
var temp=a
a=b % a
b = temp
}
b
}
Scala 也有 do-while 循環(huán),它和 while 循環(huán)類似,只是檢查條件是否滿足在循環(huán)體執(zhí)行之后檢查。例如:
var line=""
do {
line = readLine()
println("Read: " + line)
} while (line !="")
Scala 的 while 和 do-while 稱為“循環(huán)”而不是表達(dá)式,是因為它不產(chǎn)生有用的返回值(或是返回值為 Unit),可以寫成().”()”的存在使得 Scala 的 Unit 和 Java 的 void 類型有所不同。比如下面的語句在 Scala 中解釋器中執(zhí)行:
scala> def greet() { println("hi")}
greet: ()Unit
scala> greet() == ()
<console>:9: warning: comparing values of types Unit and Unit using `==' will always yield true
greet() == ()
^
hi
res0: Boolean = true
可以看到(或者看到警告) greet()的返回值和()比較結(jié)果為 true。
注意另外一種可以返回 Unit 結(jié)果的語句為 var 類型賦值語句,如果你使用如下 Java 風(fēng)格的語句將碰到麻煩:
while((line=readLine())!="")
println("Read: " + line)
如果你試圖編譯或是執(zhí)行這段代碼會有如下警告:
/root/scala/demo.scala:2: warning: comparing values of types Unit and String using `!=' will always yield true
while((line=readLine())!="")
意思 Unit(賦值語句返回值)和 String 做不等比較永遠(yuǎn)為 true。什么的代碼會是一個死循環(huán)。
正因為 While 循環(huán)沒有值,因此在純函數(shù)化編程中應(yīng)該避免使用 while 循環(huán),Scala 保留的 While 循環(huán)是因為在某些時候使用循環(huán)代碼比較容易理解,而如果使用純函數(shù)化編程時,需要執(zhí)行一些重復(fù)運行的代碼,通常就需要使用回溯函數(shù)來實現(xiàn),回溯函數(shù)通??雌饋聿皇呛苤庇^。
比如前面計算最大公因數(shù)的函數(shù)使用純函數(shù)化編程使用回溯函數(shù)實現(xiàn)如下:
def gcd (x :Long, y:Long) :Long =
if (y ==0) x else gcd (y, x % y
總的來說,推薦盡量避免在代碼使用 while 循環(huán),正如函數(shù)化編程要避免使用 var 變量一樣。 而使用 while 循環(huán)時通常也會使用到 var 變量,因此在你打算使用 while 循環(huán)時需要特別小心,看是否可以避免使用它們。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: