位置:首頁 > 高級語言 > Scala教學 > Scala模式匹配

Scala模式匹配

模式匹配是Scala中第二個最廣泛使用的功能,經過函數值和閉包。Scala中大力支持模式匹配處理消息。

模式匹配包括替代的序列,每個開始使用關鍵字case。每個備選中包括模式和一個或多個表達式,如果模式匹配將被計算。一個箭頭符號=>分開的表達模式。這裡是一個小例子,它展示了如何匹配一個整數值:

object Test {
   def main(args: Array[String]) {
      println(matchTest(3))

   }
   def matchTest(x: Int): String = x match {
      case 1 => "one"
      case 2 => "two"
      case _ => "many"
   }
}

當上述代碼被編譯和執行時,它產生了以下結果:

C:/>scalac Test.scala
C:/>scala Test
many

C:/>

使用case語句塊定義一個函數,該函數映射整數字符串。匹配關鍵字提供應用函數(如模式匹配函數以上)為一個對象的一個方便的方法。下麵是第二個示例,它匹配針對不同類型的模式值:

object Test {
   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"
   }
}

當上述代碼被編譯和執行時,它產生了以下結果:

C:/>scalac Test.scala
C:/>scala Test
2
many
one

C:/>

第一個case ,如果 x 指的是整數值1. 如果x等於字符串“2”的第二case相匹配匹配。第三種case 是由一個輸入模式;它匹配針對任何整數,並結合選擇值xto整數類型的變量y。以下為文字相同的匹配... case 表達式用括號 {...} 另一種形式:

object Test {
   def main(args: Array[String]) {
      println(matchTest("two"))
      println(matchTest("test"))
      println(matchTest(1))

   }
   def matchTest(x: Any){
      x match {
         case 1 => "one"
         case "two" => 2
         case y: Int => "scala.Int"
         case _ => "many"
      }
   }
}

匹配使用case 類:

case classes是用於模式匹配與case 表達式指定類。這些都是標準類具有特殊修飾:case。下麵是一個簡單的模式使用case class匹配示例:

object Test {
   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, empty one.
   case class Person(name: String, age: Int)
}

當上述代碼被編譯和執行時,它產生了以下結果:

C:/>scalac Test.scala
C:/>scala Test
Hi Alice!
Hi Bob!
Age: 32 year, name: Charlie?

C:/>

增加 case 關鍵字使編譯器自動添加了許多實用的功能。關鍵字建議與模式匹配的情況下表達式的關聯。

首先,編譯器會自動轉換的構造函數的參數為不可變的字段(vals)。val關鍵字是可選的。如果想可變字段,使用var關鍵字。因此,構造函數的參數列表現在更短。

其次,編譯器自動實現equals, hashCode, 和toString方法的類,它使用指定為構造函數參數的字段。因此,不再需要自己的toString方法。

最後,還消失Person類的主體部分,因為冇有需要定義的方法!