Scala - 模式匹配



模式匹配是 Scala 中僅次於函式值和閉包的第二大常用特性。Scala 在處理訊息時提供了對模式匹配的大力支援。

模式匹配包括一系列備選方案,每個備選方案都以關鍵字case開頭。每個備選方案都包含一個模式和一個或多個表示式,如果模式匹配,則將評估這些表示式。箭頭符號=>將模式與表示式分隔開。

嘗試以下示例程式,該程式演示瞭如何針對整數值進行匹配。

示例

object Demo {
   def main(args: Array[String]) {
      println(matchTest(3))
   }
   
   def matchTest(x: Int): String = x match {
      case 1 => "one"
      case 2 => "two"
      case _ => "many"
   }
}

將上述程式儲存在Demo.scala中。以下命令用於編譯和執行此程式。

命令

\>scalac Demo.scala
\>scala Demo

輸出

many

包含 case 語句的塊定義了一個函式,該函式將整數對映到字串。match 關鍵字提供了一種方便的方法來將函式(如上面的模式匹配函式)應用於物件。

嘗試以下示例程式,該程式將值與不同型別的模式進行匹配。

示例

object Demo {
   def main(args: Array[String]) {
      println(matchTest("two"))
      println(matchTest("test"))
      println(matchTest(1))
   }
   
   def matchTest(x: Any): Any = x match {
      case 1 => "one"
      case "two" => 2
      case y: Int => "scala.Int"
      case _ => "many"
   }
}

將上述程式儲存在Demo.scala中。以下命令用於編譯和執行此程式。

命令

\>scalac Demo.scala
\>scala Demo

輸出

2
many
one

使用 Case 類進行匹配

Case 類是在模式匹配中與 case 表示式一起使用的特殊類。在語法上,它們是帶有特殊修飾符的標準類:case

嘗試以下示例,這是一個使用 case 類的簡單模式匹配示例。

示例

object Demo {
   def main(args: Array[String]) {
      val alice = new Person("Alice", 25)
      val bob = new Person("Bob", 32)
      val charlie = new Person("Charlie", 32)
   
      for (person <- List(alice, bob, charlie)) {
         person match {
            case Person("Alice", 25) => println("Hi Alice!")
            case Person("Bob", 32) => println("Hi Bob!")
            case Person(name, age) => println(
               "Age: " + age + " year, name: " + name + "?")
         }
      }
   }
   case class Person(name: String, age: Int)
}

將上述程式儲存在Demo.scala中。以下命令用於編譯和執行此程式。

命令

\>scalac Demo.scala
\>scala Demo

輸出

Hi Alice!
Hi Bob!
Age: 32 year, name: Charlie?

新增 case 關鍵字會導致編譯器自動新增許多有用的功能。該關鍵字表示與模式匹配中的 case 表示式相關聯。

首先,編譯器會自動將建構函式引數轉換為不可變欄位 (vals)。val 關鍵字是可選的。如果需要可變欄位,請使用 var 關鍵字。因此,我們的建構函式引數列表現在更短了。

其次,編譯器會自動為類實現equals、hashCodetoString方法,這些方法使用指定為建構函式引數的欄位。因此,我們不再需要自己的 toString() 方法。

最後,Person類的主體也變為空,因為沒有我們需要定義的方法!

廣告