成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Scala:match表達式、break和continue

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

match表達式

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

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

作為例子,代碼7.14里的腳本從參數列表讀入食物名然后打印食物配料。match表達式檢查參數列表的第一個參數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表達式

與Java的switch語句比,匹配表達式還有一些重要的差別。其中之一是任何種類的常量,或其他什么東西,都能用作Scala里的case,而不只是Java的case語句里面的整數類型和枚舉常量。在這個例子里,可選項是字串。另一個區別是在每個可選項的最后并沒有break。取而代之,break是隱含的,不會有從一個可選項轉到另一個里面去的情況。這通常把代碼變短了,并且避免了一些錯誤的根源,因為程序員不再因為疏忽在選項里轉來轉去。

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

  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表達式

離開break和continue

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

最簡單的方式是用if替換每個every和用布爾變量替換每個break。布爾變量指代是否包含它的while循環應該繼續。比如說,假設你正搜索一個參數列表去查找以“.scala”結尾但不以連號開頭的字串。Java里你可以——如果你很喜歡while循環,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的代碼,代之以執行一個if然后continue,你可以寫一個if環繞while余下的全部內容。要去掉break,你可以增加一個布爾變量提示是否繼續做下去,不過在這里你可以復用foundIt。使用這兩個技巧,代碼就可以像代碼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的循環

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

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

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

代碼 7.17 不用var做循環的遞歸替代方法

代碼7.17的版本提供了一個能夠看得懂的名字說明這個函數在做什么,它用遞歸替代了循環。每個continue都被帶有i + 1做參數的遞歸調用替換掉,有效地跳轉到下一個整數。許多人都發現當他們開始使用遞歸后,這種編程風格更易于理解。

注意

Scala編譯器不會實際對代碼7.17展示的代碼生成遞歸函數。因為所有的遞歸調用都在尾調用:tail-call位置,編譯器會產生出與while循環類似的代碼。每個遞歸調用將被實現為回到函數開始位置的跳轉。

【相關閱讀】

  1. 學習Scala:使用try-catch表達式處理異常
  2. Scala中的for表達式:枚舉的“瑞士軍刀”
  3. Scala中的if表達式和while循環
  4. 學習Scala的重載方法和隱式轉換
  5. Scala的四種標識符構成方式

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

2009-07-21 14:03:00

Scalaif表達式while循環

2020-07-19 07:44:16

PHP 8.0Match語法

2012-07-18 09:45:32

Java 8ScalaLambda

2009-09-16 14:22:44

preg_match正

2009-08-20 14:57:00

C#正則表達式

2009-07-21 14:16:18

Scalafor表達式

2009-07-21 14:30:38

Scalatry-catch

2018-09-27 15:25:08

正則表達式前端

2014-01-05 17:41:09

PostgreSQL表達式

2009-12-29 10:22:51

Scala 2.8

2010-11-16 14:53:02

Oracle游標表達式

2009-09-17 09:09:50

Lambda表達式Linq查詢

2009-11-26 18:00:46

PHP正則表達式pre

2009-05-22 11:38:55

PHPpreg_match_正則表達式

2024-03-25 13:46:12

C#Lambda編程

2009-05-22 09:48:07

表達式樹泛型委托.NET

2023-11-02 18:45:00

Rust編程表達式

2009-11-27 13:53:43

PHP函數preg_m

2009-08-10 17:11:34

.NET 3.5擴展方Lambda表達式

2023-11-01 13:32:42

Go代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品视频一区二区三区不卡 | 国产在线视频在线观看 | 亚洲视频一区在线观看 | 国产精品高潮呻吟久久 | 精品综合视频 | 欧美电影一区 | 日韩一区二区在线视频 | 国产在线网站 | 在线成人 | 色桃网| 日韩伦理一区二区三区 | 久久综合一区二区三区 | 天天操天天插 | 日韩在线免费看 | 亚洲一区中文 | 欧美日韩精品区 | 国产视频久久久 | 亚洲午夜小视频 | 亚洲理论在线观看电影 | 国产高清久久久 | 在线观看www | 91在线最新 | 欧美一级在线 | 日韩视频在线免费观看 | 日韩欧美国产精品综合嫩v 一区中文字幕 | 日韩高清国产一区在线 | 在线观看中文字幕一区二区 | 久久久av | 成人小视频在线免费观看 | 日韩高清一区二区 | 9久9久9久女女女九九九一九 | 精品欧美 | 欧美国产精品久久久 | 中文字幕日韩欧美一区二区三区 | 久热精品免费 | 天天干天天爽 | 欧日韩不卡在线视频 | 欧美成人h版在线观看 | 日韩第1页 | 国产精品国产三级国产aⅴ浪潮 | 午夜一区二区三区在线观看 |