国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Scala中的if表達式和while循環

開發 后端
本文節選自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻譯的《Programming in Scala》的第七章。Scala是一種針對 JVM 將函數和面向對象技術組合在一起的編程語言。

if表達式

Scala的if如同許多其它語言中的一樣工作。它測試一個狀態并據其是否為真,執行兩個分支中的一個。下面是一個常見的例子,以指令式風格編寫:

51CTO編輯推薦:Scala編程語言專題

  1. var filename = "default.txt" 
  2. if (!args.isEmpty)  
  3.  filename = args(0)  
這段代碼聲明了一個變量,filename,并初始化為缺省值。然后使用if表達式檢查是否提供給程序了任何參數。如果是,就把變量改成定義在參數列表中的值。如果沒有參數,就任由變量設定為缺省值。

這段代碼可以寫得更好一點,因為就像第2章第三步提到過的,Scala的if是能返回值的表達式。代碼7.1展示了如何不使用任何var而實現前面一個例子同樣的效果:

  1. val filename =  
  2.  if (!args.isEmpty) args(0)  
  3.  else "default.txt" 

代碼 7.1 在Scala里根據條件做初始化的慣例

這一次,if有了兩個分支。如果args不為空,那么初始化元素,args(0),被選中。否則,缺省值被選中。這個if表達式產生了被選中的值,然后filename變量被初始化為這個值。這段代碼更短一點兒,不過它的實際優點在于使用了val而不是var。使用val是函數式的風格,并能以差不多與Java的final變量同樣的方式幫到你。它讓代碼的讀者確信這個變量將永不改變,節省了他們掃描變量字段的所有代碼以檢查它是否改變的工作。

使用val而不是var的第二點好處是他能更好地支持等效推論:equational reasoning。在表達式沒有副作用的前提下,引入的變量等效于計算它的表達式。因此,無論何時都可以用表達式替代變量名。如,要替代println(filename),你可以這么寫:

  1. println(if (!args.isEmpty) args(0else "default.txt"

選擇權在你。怎么寫都行。使用val可以幫你安全地執行這類重構以不斷革新你的代碼。

盡可能尋找使用val的機會。它們能讓你的代碼既容易閱讀又容易重構。

while循環

Scala的while循環表現的和在其它語言中一樣。包括一個狀態和循環體,只要狀態為真,循環體就一遍遍被執行。代碼7.2展示了一個例子:

  1. def gcdLoop(x: Long, y: Long): Long = {  
  2.  var a = x  
  3.  var b = y  
  4.  while (a != 0) {  
  5.   val temp = a  
  6.   a = b % a  
  7.   b = temp  
  8.  }  
  9.  b  

代碼 7.2 用while循環計算***公約數

Scala也有do-while循環。除了把狀態測試從前面移到后面之外,與while循環沒有區別。代碼7.3展示了使用do-while反饋從標準輸入讀入的行記錄直到讀入空行為止的Scala腳本:

  1. var line = "" 
  2. do {  
  3.  line = readLine()  
  4.  println("Read: " + line)  
  5. while (line != null)  

代碼 7.3 用do-while從標準輸入讀取信息

while和do-while結構被稱為“循環”,不是表達式,因為它們不產生有意義的結果,結果的類型是Unit。說明產生的值(并且實際上是唯一的值)的類型為Unit。被稱為unit value,寫做()。()的存在是Scala的Unit不同于Java的void的地方。請在解釋器里嘗試下列代碼:

  1. scala> def greet() { println("hi") }  
  2. greet: ()Unit  
  3. scala> greet() == ()  
  4. hi  
  5. res0: Boolean = true 

由于方法體之前沒有等號,greet被定義為結果類型為Unit的過程。因此,greet返回unit值,()。這被下一行確證:比較greet的結果和unit值,(),的相等性,產生true。

另一個產生unit值的與此相關的架構,是對var的再賦值。比如,假設嘗試用下面的從Java(或者C或C++)里的while循環成例在Scala里讀取一行記錄,你就遇到麻煩了:

  1. var line = "" 
  2. while ((line = readLine()) != ""// 不起作用  
  3.  println("Read: "+ line)  

編譯這段代碼時,Scala會警告你使用!=比較類型為Unit和String的值將永遠產生true。而在Java里,賦值語句可以返回被賦予的那個值,同樣情況下標準輸入返回的一條記錄在Scala的賦值語句中永遠產生unit值,()。因此,賦值語句“line = readLine()”的值將永遠是()而不是""。結果,這個while循環的狀態將永遠不會是假,于是循環將因此永遠不會結束。

由于while循環不產生值,它它經常被純函數式語言所舍棄。這種語言只有表達式,沒有循環。雖然如此,Scala仍然包含了while循環,因為有些時候指令式的解決方案更可讀,尤其是對那些以指令式背景為主導的程序員來說。例如,如果你想做一段重復某進程直到某些狀態改變的算法代碼,while循環可以直接地表達而函數式的替代者,大概要用遞歸實現,或許對某些代碼的讀者來說就不是那么顯而易見的了。

如,代碼7.4展示了計算兩個數的***公約數的替代方式。 給定同樣的值x和y,代碼7.4展示的gcd函數將返回與代碼7.2中gcdLoop函數同樣的結果。這兩種方式的不同在于gcdLoop寫成了指令式風格,使用了var和while循環,而gcd更函數式風格,采用了遞歸(gcd調用自身)并且不需要var:

  1. def gcd(x: Long, y: Long): Long =  
  2.  if (y == 0) x else gcd(y, x % y)  

代碼 7.4 使用遞歸計算***公約數

通常意義上,我們建議你如質疑var那樣質疑你代碼中的while循環。實際上,while循環和var經常是結對出現的。因為while循環不產生值,為了讓你的程序有任何改變,while循環通常不是更新var就是執行I/O。可以在之前的gcdLoop例子里看到。在while循環工作的時候,更新了a和b兩個var。因此,我們建議你在代碼中對while循環抱有更懷疑的態度。如果沒有對特定的while或do循環較好的決斷,請嘗試找到不用它們也能做同樣事情的方式。

【相關閱讀】

  1. 學習Scala的重載方法和隱式轉換
  2. Scala的四種標識符構成方式
  3. Scala的私有字段和定義操作符
  4. Scala的從構造器:主構造器之外的構造器
  5. 在Scala中檢查先決條件、添加字段和自指向

責任編輯:book05 來源: Artima
相關推薦

2012-07-18 09:45:32

Java 8ScalaLambda

2009-07-21 14:38:08

Scalamatch表達式break和conti

2009-07-21 14:16:18

Scalafor表達式

2024-01-05 17:41:36

Rust編程循環

2024-03-25 13:46:12

C#Lambda編程

2009-12-29 10:22:51

Scala 2.8

2018-09-27 15:25:08

正則表達式前端

2009-07-21 14:30:38

Scalatry-catch

2011-05-30 16:11:46

Javascript

2014-01-05 17:41:09

PostgreSQL表達式

2011-03-14 14:02:55

Python

2009-07-09 09:51:07

Lambda表達式C#

2022-01-14 07:56:39

C#動態查詢

2020-11-04 09:23:57

Python

2010-09-10 15:20:11

SQL函數計算表達式

2010-11-16 14:53:02

Oracle游標表達式

2021-03-24 13:17:41

編程循環語句Java

2009-09-17 09:09:50

Lambda表達式Linq查詢

2020-12-18 09:05:13

算法單調棧

2022-09-19 14:12:27

C++Lambda表達式
點贊
收藏

51CTO技術棧公眾號

欧美视频在线观看免费| 日本久久久网站| 欧美日韩系列| 亚洲深夜视频| 成人午夜精品在线| 欧美一级爱爱视频| 四虎国产精品免费久久5151| 欧美韩日一区二区三区四区| 欧美精品七区| 婷婷激情综合| 蜜桃麻豆91| 可播放的18gay1069| 精品麻豆剧传媒av国产九九九| 青春草在线视频| 香港久久久电影| 国产精品嫩草99av在线| 亚洲图片欧美色图| 国产免费裸体视频| 91精品一区二区三区综合| 另类视频在线观看| 丰满大乳少妇在线观看网站| 色网综合在线观看| 在线麻豆国产传媒1国产免费| 国产日韩欧美精品综合| 亚洲在线色站| 久久er精品视频| 伊人久久婷婷色综合98网| 国产日韩亚洲欧美精品| 91在线|亚洲| 欧美专区在线| 亚洲一区二区在| 国产一二精品视频| 欧美v在线观看| 91在线小视频| 成视人a免费观看视频| 亚洲精选在线视频| 91最新在线免费观看| 99久久精品网| 欧美日韩久久一区二区| 亚洲午夜av电影| 成人免费自拍视频| 成人一区二区三| 久久五月天小说| 精品欧美一区二区久久| 黄页大全在线免费观看| 亚洲精品视频一区二区| 国产在线中文字幕| 精品久久久久久久久久久久包黑料 | 每日在线观看av| 精品国产乱码久久久久久免费| 国产精品一区三区| 中文字幕一区二区三区中文字幕| 邪恶网站在线观看| 狼狼综合久久久久综合网| 欧美精品成人一区二区三区四区| 蜜桃视频在线观看一区| 国产美女特级嫩嫩嫩bbb片| 色婷婷亚洲综合| 国产美女无遮挡网站| 青青草原成人在线视频| 亚洲美女视频网站| 日韩av成人| 91精品国产欧美一区二区18| 污污的网站在线看| 性色av一区二区三区| 日本www.色| 国产精品私拍pans大尺度在线| 国产欧美一区二区精品仙草咪| 欧美色中文字幕| 懂色一区二区三区| 色视频www在线播放国产成人| 欧美影院精品| 色综合久久久久综合99| 免费在线视频一级不卡| 欧美精品乱人伦久久久久久| 国内精品久久久久久野外| 日韩av一区二区在线| 日韩网站中文字幕| 97**国产露脸精品国产| 欧美日本免费| 亚洲精品乱码视频| 久久精子c满五个校花| 91青娱乐在线视频| 精品美女一区二区| 欧美一区在线观看视频| 成人美女av在线直播| 美女www一区二区| aa在线免费观看| 午夜精品久久久久久久| 国产精品久久久久一区二区国产| 色噜噜狠狠狠综合曰曰曰| 禁果av一区二区三区| 亚洲一区二三| 欧美一区二区三区在线| 亚洲人成网www| 一本色道久久88亚洲精品综合| 欧美性猛交xxxx黑人猛交| 成人性生交大片免费网站 | 中文字幕久精品免费视频| h视频久久久| 在线观看日韩羞羞视频| 亚洲欧美精品一区| 色香欲www7777综合网| 中文字幕亚洲一区二区三区| 欧美成人精品一区二区三区在线看| 国产一区二区三区高清视频| 日韩高清不卡在线| 免费观看国产视频在线| 欧美极品少妇xxxxⅹ高跟鞋| 黄色综合网址| 成人看片app| 免费在线观看的毛片| 国产精品刘玥久久一区| 欧美成人免费网| 国产亚洲精品久久久久久牛牛 | 在线免费观看日本一区| 精品亚洲porn| 国产片在线观看| 91免费看片在线| 91精品国产91热久久久做人人| 澳门av一区二区三区| 蜜桃av久久久亚洲精品| 一区二区三区精品| 天天影视综合| 久久香蕉网站| 国产美女99p| 国产精品福利一区| 台湾佬中文娱乐久久久| 国产精品免费一区二区三区| 中文字幕在线不卡一区| 超薄肉色丝袜脚交一区二区| 国产精品久久精品国产| 亚洲柠檬福利资源导航| 国产精品日本一区二区三区在线| 日韩亚洲视频在线| 在线欧美小视频| 欧美r级电影| 男人天堂免费视频| 欧美日韩高清区| 99视频精品全部免费在线| 精精国产xxxx视频在线野外| 三上悠亚av一区二区三区| 精品欧美日韩在线| xxxxx成人.com| 婷婷成人激情在线网| 久久国产精品毛片| www.久久草.com| 天堂а√在线官网| 加勒比在线日本| 亚洲综合av一区| 久久人人97超碰国产公开结果| 国产日韩在线看| 亚洲美女屁股眼交3| 国产精品17p| 精品久久久久久久免费人妻| 在线观看久久av| 不卡视频一二三四| 欧美高清免费| 久久久久久久久久久久久国产精品 | 亚洲欧美久久久久一区二区三区| 欧美伊人久久久久久午夜久久久久| 色综合天天爱| 日韩美女一级视频| 91偷拍精品一区二区三区| 91国在线观看| 一本色道久久综合亚洲精品不卡| 国产51人人成人人人人爽色哟哟| 99三级在线| 日韩欧美一级二级| 免费在线观看视频一区| 在线中文字幕播放| 苍井空浴缸大战猛男120分钟| 欧美成人精品在线视频| 久久精品日产第一区二区三区高清版| 视频精品一区| 95影院理论片在线观看| av资源站久久亚洲| 亚洲国产天堂久久综合网| 成人免费的视频| 久久99国产精品久久99大师| 91高清免费视频| 亚洲国产精品系列| 国产精品久久久久久婷婷天堂| 2025国产精品视频| 欧美剧在线观看| 国模视频一区二区| 91wwwcom在线观看| 成人啪啪免费看| 国产亚洲精品久久飘花| 国产不卡一区视频| 国产精品一区免费观看| 在线综合欧美| av日韩电影| 天天插天天操天天射| 国产精品高潮呻吟久久av无限| 欧美日韩在线不卡| 国产不卡视频在线播放| 日韩有码一区| 色综合999| 美女激情网站|