標籤:

#scala#模式匹配

Scala的模式匹配(Pattern Matching)非常靈活,如以下程序:

//Scala的模式匹配程序nnobject PatternMatchingDemo {n def main(args: Array[String]): Unit = {n def matchingDemo(expr: Any) =n expr match {n case (a, b, c) => println("匹配具有三個元素的元組")n case m: Map[_, _] => println("匹配映射")n case e @ (a: Array[Int]) if a.length == 5 => e.map(_ * 2).foreach(println)n case _ =>n }nn matchingDemo((1, 2, "三"))n matchingDemo(Map(1 -> "First", 2 -> "Second", 3 -> "Third"))n matchingDemo(Array(2, 3, 5, 7, 11))n }n}n

輸出:

匹配具有三個元素的元組n匹配映射n4n6n10n14n22n[Finished in 2.8s]n

特別是:

case m: Map[_, _] => println("匹配映射")ncase e @ (a: Array[Int]) if a.length == 5 => e.map(_ * 2).foreach(println)n

這兩行代碼,要特別關注Type erasure(類型消除)。只有數組是特例,可以指定具體元素類型。其他結構就不行了,比如Map。

還運用了變數綁定e @ (a: Array[Int])以及Pattern guards(模式守衛)if a.length == 5,變數綁定之後,可以用e來指代(a: Array[Int]),模式守衛通過條件表達式限制只有長度為5個元素的數組才滿足匹配條件。

Scala的新特性非常多,多即複雜,但也意味著功能強大。總之,Scala還是挺有趣的......

推薦閱讀:

【太閣x周刊】第十一期:紐約線下活動預告、技術討論群熱點話題、Scala中的Typeclass模式實例、人氣文章
提議:在Dotty 中使用縮進語法
Stack monads in Scala
Scala快速入門-6-單例對象及伴生對象
究竟使用什麼語言去計算?

TAG:Scala |