在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Scala/ while 循環(huán)
包對象
Ordered Trait
組合和繼承–定義 final 成員
基本數(shù)據(jù)類型
Match 表達式
類和對象 (三)
操作基本數(shù)據(jù)類型
for 表達式
組合和繼承–重載成員函數(shù)和方法
類和對象 (二)
組合和繼承–定義 factory 對象
組合和繼承–多態(tài)和動態(tài)綁定
Trait 的基本概念
if 表達式
組合和繼承–抽象類
函數(shù)–函數(shù)字面量的一些簡化寫法
while 循環(huán)
組合和繼承–使用組合還是繼承?
訪問控制修飾符
Trait 示例–Rectangular 對象
組合和繼承–定義參數(shù)化成員變量
組合和繼承–定義無參數(shù)方法
類和對象 (一)
函數(shù)–閉包
函數(shù)–類成員函數(shù)
Scala 基本數(shù)據(jù)類型的實現(xiàn)方法
try 表達式處理異常
選擇瘦接口還是胖接口設(shè)計?
組合和繼承–小結(jié)
創(chuàng)建新的控制結(jié)構(gòu)
使用 import
為訪問控制修飾符添加作用域
Scala 的類層次關(guān)系
類和對象 (五)
傳名參數(shù)
柯里化函數(shù)
函數(shù)–頭等公民
組合和組合和繼承–定義 heighten 和 widen 函數(shù)
使用 Package–將代碼放入包中
隱含的 import
所有類的公共子類–底層類型
進一步 Scala
函數(shù)–局部函數(shù)
引用包中的代碼
組合和繼承–使用 override 修飾符
組合和繼承–實現(xiàn)類 Element 的 above,beside 和 toString()方法
類和對象 (四)
函數(shù)–尾遞歸
沒有“break”和“continue”的日子
組合和繼承–調(diào)用基類構(gòu)造函數(shù)
減低代碼重復
函數(shù)–函數(shù)–可變參數(shù),命名參數(shù),缺省參數(shù)
起步 Scala
組合和繼承–擴展類
函數(shù)–部分應(yīng)用的函數(shù)
開始神奇的 Scala編程之旅
組合和繼承–概述
Trait 用來實現(xiàn)可疊加的修改操作

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)”而不是表達式,是因為它不產(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 風格的語句將碰到麻煩:

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 做不等比較永遠為 true。什么的代碼會是一個死循環(huán)。

正因為 While 循環(huán)沒有值,因此在純函數(shù)化編程中應(yīng)該避免使用 while 循環(huán),Scala 保留的 While 循環(huán)是因為在某些時候使用循環(huán)代碼比較容易理解,而如果使用純函數(shù)化編程時,需要執(zhí)行一些重復運行的代碼,通常就需要使用回溯函數(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)時需要特別小心,看是否可以避免使用它們。