官术网_书友最值得收藏!

  • Scala編程(第5版)
  • (德)馬丁·奧德斯基等
  • 1199字
  • 2022-05-06 15:51:49

7.2 while循環(huán)

Scala的while循環(huán)與其他語言中的沒有多大差別。它包含了一個條件檢查和一個循環(huán)體,只要條件檢查為真,就會一遍接一遍地執(zhí)行循環(huán)體。參考示例7.2。

示例7.2 用while循環(huán)計算最大公約數(shù)

我們把while這樣的語法結構稱為“循環(huán)”而不是表達式,是因為它并不會返回一個有意義的值,其返回值的類型是Unit。實際上存在這樣一個(也是唯一的一個)類型為Unit的值,這個值叫作單元值unit value),被寫作()。存在這樣一個()值,可以說是Scala的Unit與Java的void的不同。可以嘗試在編譯器中輸入:

由于表達式println("hi") 的類型為Unit,因此greet被定義為一個結果類型為Unit的過程。這樣一來,greet返回單元值()。這一點在接下來的一行中得到了印證:對greet的結果和單元值()進行相等性判斷,得到true。

Scala 3不再提供do-while循環(huán),這是一個在循環(huán)體之后執(zhí)行條件檢查而不是在循環(huán)體之前執(zhí)行條件檢查的控制結構。取而代之的是,可以將循環(huán)體對應的語句直接寫在while之后,然后以do()收尾。示例7.3展示了使用這種編寫方式來打印從標準輸入中讀取的文本行直到用戶輸入空白行為止的Scala腳本。

示例7.3 在不使用do-while循環(huán)的情況下至少執(zhí)行一遍循環(huán)體

另一個相關的返回單元值的語法結構是對var的賦值。例如,當你嘗試在Scala中像Java(或C/C++)的while循環(huán)慣用法那樣使用while循環(huán)時,會遇到問題:

在編譯這段代碼時,Scala編譯器會給出一個警告:用!=對類型為Unit的值和String做比較將永遠返回true。在Java中,賦值語句的結果是被賦予的值(在本例中就是從標準輸入中讀取的一行文本),而在Scala中賦值語句的結果永遠是單元值()。因此,賦值語句“line = readLine()”將永遠返回(),而不是""。這樣一來,while循環(huán)的條件檢查結果永遠都不會為false,從而導致循環(huán)無法終止。

由于while循環(huán)沒有返回值,因此純函數(shù)式編程語言通常都不支持while循環(huán)。這些語言有表達式,但沒有循環(huán)。盡管如此,Scala還是包括了while循環(huán),因為有時候指令式的解決方案更易讀,尤其是對那些以指令式編程風格為主的程序員而言。舉例來說,如果你想要編寫一段重復某個處理邏輯直到某個條件發(fā)生變化為止的算法的代碼時,則while循環(huán)能夠直接表達出來,而函數(shù)式的替代方案(可能用到了遞歸)對某些讀者而言就沒有那么直觀了。

例如,示例7.4給出了一個計算兩個數(shù)的最大公約數(shù)的另一種實現(xiàn)方式。[1]xy同樣的兩個值,示例7.4的gcd函數(shù)將返回與示例7.2中的gcdLoop函數(shù)相同的結果。這兩種方案的區(qū)別在于gcdLoop是指令式編程風格的,用到了varwhile循環(huán),而gcd是更加函數(shù)式編程風格的,用到了遞歸(gcd調用了自己),并且不需要var。

示例7.4 用遞歸計算最大公約數(shù)

一般來說,我們建議你像挑戰(zhàn)var那樣挑戰(zhàn)代碼中的while循環(huán)[2]。事實上,while循環(huán)和var通常都是一起出現(xiàn)的。由于while循環(huán)沒有返回值,因此要想對程序產生任何效果,while循環(huán)通常要么更新一個var,要么執(zhí)行I/O。先前的gcdLoop示例已經很好地展示了這一點。在這個while循環(huán)執(zhí)行過程中,更新了var變量ab。因此,我們建議你對代碼中的while循環(huán)保持警惕。如果對于某個特定的while循環(huán),我們找不到合理的理由來使用它,那么應該嘗試采用其他方案來完成同樣的工作。

主站蜘蛛池模板: 北安市| 托克托县| 绥棱县| 永丰县| 大同县| 蒙自县| 固镇县| 郸城县| 西城区| 宜春市| 清丰县| 宝兴县| 玉树县| 宁安市| 龙川县| 临澧县| 万山特区| 禄丰县| 兴城市| 农安县| 宾川县| 鸡西市| 姚安县| 奉新县| 合水县| 蓬溪县| 徐州市| 西丰县| 丹寨县| 遂平县| 峨山| 泸定县| 高淳县| 灵寿县| 东方市| 永清县| 巴彦淖尔市| 松桃| 江永县| 石阡县| 巨鹿县|