match 運算式


match運算式就類似其它語言(如C/C++、Java)經常會提供的switch,一個使用的例子如下:
print("請輸入分數:")
val level = readInt / 10
level match {
case 10 | 9 => println("等級 A")
case 8 => println("等級 B")
case 7 => println("等級 C")
case 6 => println("等級 D")
case _ => println("等級 E")
}

這個範例可以讓你輸入分數,經match比對後顯示對應的得分等級。與其它語言所提供的switch不同的是,case不需使用break(Scala中也沒有break可以使用,也沒有continue),case比對成功並執行後,就自動離開match運算式,不會再往下一個case進行比對,如果有多個情況符合時要執行同一運算,則使用 |。預設的case則使用_(在Scala中,_基本上是用來作為未知值的佔位字元),如果沒有比對到任何case,則match運算式會丟出MatchError

在Scala中,match是個運算式,所以它可以有傳回值,上面的程式可以改寫為以下:
print("請輸入分數:")
val level = readInt / 10 match {
case 10 | 9 => "A"
case 8 => "B"
case 7 => "C"
case 6 => "D"
case _ => "E"
}
println("等級 " + level)

不像其它語言的switch,match運算式不僅可以比對可以讓你比對數字或字元,也可以是字串,例如:
print("請輸入名稱:")
val authority = readLine match {
case "Justin" => "站長"
case "caterpillar" => "版主"
case _ => "會員"
}
println(authority)

事實上,match不僅可以比較字串,它可以使用模式(Pattern),一個例子可以由快速排序的實現來看:
object Sort {
def quick(list: List[Int]): List[Int] = {
list match {
case Nil => Nil
case x::xs =>
val (before,after) = xs partition (_ < x)
quick(before) ++ (x :: quick(after))
}
}
}

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