Scala while 循環(huán)

2020-08-12 09:47 更新

while 循環(huán)

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)時需要特別小心,看是否可以避免使用它們。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號