程式扎記: [Scala 小學堂] Scala Gossic : 起步走 - 內建控制結構 (match 運算式)

標籤

2016年4月17日 星期日

[Scala 小學堂] Scala Gossic : 起步走 - 內建控制結構 (match 運算式)

轉載自 這裡 
前言 : 
Scala 是一個可直譯、編譯、靜態、運行於 JVM 之上、可與 Java 互操作、融合物件導向編程特性與函式編程風格的程式語言. 從一些簡單的語法開始,了解 Scala 的許多特性,所以就算是起步走,東西也夠多了. 簡單的小程式可以使用 scala 指令,編譯的事就交給 scalac,編譯想快點就用 fsc. (Scala 官網), 運算式有傳回值,迴圈沒有,對了!Scala 沒有 break 與 continue. 

match 運算式 : 
match 運算式就類似其它語言(如 C/C++、Java)經常會提供的 switch,一個使用的例子如下 : 
- Match1.scala 代碼 :
  1. print("Please input points: ")  
  2. val level = readInt / 10  
  3. level match {  
  4.         case 10 | 9 => println("Level A")  
  5.         case 8 => println("Level B")  
  6.         case 7 => println("Level C")  
  7.         case 6 => println("Level D")  
  8.         case _ => println("Level E")  
  9. }  

這個範例可以讓你輸入分數,經 match 比對後顯示對應的得分等級。與其它語言所提供的 switch 不同的是,case 不需使用 break(Scala中也沒有break可以使用,也沒有continue),case 比對成功並執行後,就自動離開 match 運算式,不會再往下一個 case 進行比對,如果有多個情況符合時要執行同一運算,則使用 |。預設的case則使用_在 Scala 中,_ 基本上是用來作為未知值的佔位字元),如果沒有比對到任何 case,則 match 運算式會丟出MatchError
在 Scala中,match 是個運算式,所以它可以有傳回值,上面的程式可以改寫為以下 : 
- Match2.scala 代碼 :
  1. print("Please input point: ")  
  2. val level = readInt / 10 match {  
  3.         case 10 | 9 => "A"  
  4.         case 8 => "B"  
  5.         case 7 => "C"  
  6.         case 6 => "D"  
  7.         case _ => "E"  
  8. }  
  9. println("Level "+level)  

不像其它語言的 switch,match 運算式不僅可以比對可以讓你比對數字或字元,也可以是字串,例如 : 
- Match3.scala 代碼 :
  1. print("Pleaes input name: ")  
  2. val authority = readLine match {  
  3.         case "John" => "Master"  
  4.         case "Peter" => "Teacher"  
  5.         case _ => "Student"  
  6. }  
  7. println(authority)  

事實上,match 不僅可以比較字串,它可以使用模式(Pattern),一個例子可以由 快速排序 的實現來看 : 
- Pattern.scala 代碼 :
  1. object Sort {  
  2.     def quick(list: List[Int]): List[Int] = {  
  3.        list match {  
  4.            case Nil => Nil       
  5.            case x::xs =>          
  6.            val (before,after) = xs partition (_ < x)  
  7.            quick(before) ++ (x :: quick(after))  
  8.        }  
  9.     }  
  10. }  

你暫時不用深究上面這個範例是如何實現,僅需先知道,match 所提供的,其實正是模式比對的功能,而不僅是其它語言中 switch 的作用,模式比對之後還會詳加說明. 

Supplement 
起步走 - 內建控制結構 (if 運算式) 
起步走 - 內建控制結構 (for 運算式) 
起步走 - 內建控制結構 (while 迴圈) 
起步走 - 內建控制結構 (match 運算式) 
起步走 - 內建控制結構 (try 運算式)

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!