日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Scala:match表達(dá)式、break和continue

match表達(dá)式

Scala的匹配表達(dá)式允許你在許多可選項(xiàng):alternative中做選擇,就好象其它語言中的switch語句。通常說來match表達(dá)式可以讓你使用任意的模式:pattern做選擇。通用的模式可以稍等再說。目前,只要考慮使用match在若干可選項(xiàng)中做選擇。

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

作為例子,代碼7.14里的腳本從參數(shù)列表讀入食物名然后打印食物配料。match表達(dá)式檢查參數(shù)列表的第一個(gè)參數(shù)firstArg。如果是字串"salt",就打印"pepper",如果是"chips",就打印"salsa",如此遞推。缺省情況用下劃線(_)說明,這是常用在Scala里作為占位符表示完全不清楚的值的通配符。

 
 
 
  1. val firstArg = if (args.length > 0) args(0) else ""
  2. firstArg match {
  3. case "salt" => println("pepper")
  4. case "chips" => println("salsa")
  5. case "eggs" => println("bacon")
  6. case _ => println("huh?")
  7. }

代碼 7.14 有副作用的match表達(dá)式

與Java的switch語句比,匹配表達(dá)式還有一些重要的差別。其中之一是任何種類的常量,或其他什么東西,都能用作Scala里的case,而不只是Java的case語句里面的整數(shù)類型和枚舉常量。在這個(gè)例子里,可選項(xiàng)是字串。另一個(gè)區(qū)別是在每個(gè)可選項(xiàng)的最后并沒有break。取而代之,break是隱含的,不會(huì)有從一個(gè)可選項(xiàng)轉(zhuǎn)到另一個(gè)里面去的情況。這通常把代碼變短了,并且避免了一些錯(cuò)誤的根源,因?yàn)槌绦騿T不再因?yàn)槭韬鲈谶x項(xiàng)里轉(zhuǎn)來轉(zhuǎn)去。

然而,與Java的switch相比最顯著的差別,或許是match表達(dá)式也能產(chǎn)生值。在前一個(gè)例子里,match表達(dá)式的每個(gè)可選項(xiàng)打印輸出一個(gè)值。只生成值而不是打印也可以一樣做到,展示在代碼7.15中。match表達(dá)式產(chǎn)生的值儲(chǔ)存在friend變量里。這除了能讓代碼變得更短之外(至少減少了幾個(gè)指令),還解開了兩個(gè)不相干的關(guān)注點(diǎn):首先選擇食物名,其次打印它。

 
 
 
  1. val firstArg = if (!args.isEmpty) args(0) else ""
  2. val friend =
  3. firstArg match {
  4. case "salt" => "pepper"
  5. case "chips" => "salsa"
  6. case "eggs" => "bacon"
  7. case _ => "huh?"
  8. }
  9. println(friend)

代碼 7.15 生成值的match表達(dá)式

離開break和continue

你可能注意到了這里沒有提到過break和continue。Scala去掉了這些命令因?yàn)樗麄兣c函數(shù)式文本,下一章會(huì)談到這個(gè)特征,嚙合得不好。continue在while循環(huán)中的意思很清楚,但是在函數(shù)式文本中表示什么呢?雖然Scala既支持指令式風(fēng)格也支持函數(shù)式風(fēng)格,但在這點(diǎn)上它略微傾向于函數(shù)式編程從而換得在語言上的簡潔性。盡管如此,請(qǐng)不要著急。有許多不用break和continue的編程方式,如果你能有效利用函數(shù)式文本,就能比原來的代碼寫得更短。

最簡單的方式是用if替換每個(gè)every和用布爾變量替換每個(gè)break。布爾變量指代是否包含它的while循環(huán)應(yīng)該繼續(xù)。比如說,假設(shè)你正搜索一個(gè)參數(shù)列表去查找以“.scala”結(jié)尾但不以連號(hào)開頭的字串。Java里你可以——如果你很喜歡while循環(huán),break和continue——如此寫:

 
 
 
  1. int i = 0; // 在Java中……
  2. boolean foundIt = false;
  3. while (i < args.length) {
  4. if (args[i].startsWith("-"))
  5. {
  6. i = i + 1;
  7. continue;
  8. }
  9. if (args[i].endsWith(".scala")) {
  10. foundIt = true;
  11. break;
  12. }
  13. i = i + 1;
  14. }

如果要字面直譯成Scala的代碼,代之以執(zhí)行一個(gè)if然后continue,你可以寫一個(gè)if環(huán)繞while余下的全部內(nèi)容。要去掉break,你可以增加一個(gè)布爾變量提示是否繼續(xù)做下去,不過在這里你可以復(fù)用foundIt。使用這兩個(gè)技巧,代碼就可以像代碼7.16這樣完成了:

 
 
 
  1. var i = 0
  2. var foundIt = false
  3. while (i < args.length && !foundIt) {
  4. if (!args(i).startsWith(""))
  5. {
  6. if (args(i).endsWith(".scala"))
  7. foundIt = true
  8. }
  9. i = i + 1
  10. }

代碼 7.16 不帶break或continue的循環(huán)

這個(gè)版本與原來的Java代碼非常像。所有的主要段落仍然存在并保持原順序。有兩個(gè)可重新賦值的變量及一個(gè)while循環(huán)。循環(huán)內(nèi)有個(gè)i是否小于args.length的測(cè)試,然后檢查"-",然后檢查".scala"。

如果要去掉代碼7.16里面的var,你可以嘗試的一種方式是用遞歸函數(shù)重寫循環(huán)。比方說,你可以定義帶一個(gè)整數(shù)值做輸入的searchFrom函數(shù),向前搜索,并返回想要的參數(shù)的索引。采用這種技巧的代碼看上去會(huì)像展示在代碼7.17中這樣的:

 
 
 
  1. def searchFrom(i: Int): Int =
  2. if (i >= args.length) -1// 不要越過最后一個(gè)參數(shù)
  3. else if (args(i).startsWith("-")) searchFrom(i + 1)// 跳過選項(xiàng)
  4. else if (args(i).endsWith(".scala")) i // 找到!
  5. else searchFrom(i + 1) // 繼續(xù)找
  6. val i = searchFrom(0)

代碼 7.17 不用var做循環(huán)的遞歸替代方法

代碼7.17的版本提供了一個(gè)能夠看得懂的名字說明這個(gè)函數(shù)在做什么,它用遞歸替代了循環(huán)。每個(gè)continue都被帶有i + 1做參數(shù)的遞歸調(diào)用替換掉,有效地跳轉(zhuǎn)到下一個(gè)整數(shù)。許多人都發(fā)現(xiàn)當(dāng)他們開始使用遞歸后,這種編程風(fēng)格更易于理解。

注意

Scala編譯器不會(huì)實(shí)際對(duì)代碼7.17展示的代碼生成遞歸函數(shù)。因?yàn)樗械倪f歸調(diào)用都在尾調(diào)用:tail-call位置,編譯器會(huì)產(chǎn)生出與while循環(huán)類似的代碼。每個(gè)遞歸調(diào)用將被實(shí)現(xiàn)為回到函數(shù)開始位置的跳轉(zhuǎn)。

【相關(guān)閱讀】

  1. 學(xué)習(xí)Scala:使用try-catch表達(dá)式處理異常
  2. Scala中的for表達(dá)式:枚舉的“瑞士軍刀”
  3. Scala中的if表達(dá)式和while循環(huán)
  4. 學(xué)習(xí)Scala的重載方法和隱式轉(zhuǎn)換
  5. Scala的四種標(biāo)識(shí)符構(gòu)成方式

本文題目:Scala:match表達(dá)式、break和continue
轉(zhuǎn)載源于:http://www.dlmjj.cn/article/cdsjdgj.html