當前位置:編程學習大全網 - 源碼下載 - Scala模式匹配和樣本類

Scala模式匹配和樣本類

要理解模式匹配(pattern-matching),先把這兩個單詞拆開,先理解什麽是模式(pattern),這裏所的模式是數據結構上的,這個模式用於描述壹個結構的組成。

我們很容易聯想到“正則表達”裏的模式,不錯,這個pattern和正則裏的pattern相似,不過適用範圍更廣,可以針對各種類型的數據結構,不像正則表達只是針對字符串。比如正則表達式裏 "^A.*" 這個pattern 表示以A開頭、後續壹個或多個字符組成的字符串;List("A", _, _*) 也是個pattern,表示第壹個元素是”A”,後續壹個或多個元素的List。

match表達式可以看做是Java風格switch的泛化。當每個模式都是常量並且最後壹個模式可以是通配的時候,Java風格的switch可以被自然地表達為match表達式。但有三點不同需要牢記:

1、 通配模式 (_)匹配任意對象,它被用作默認的“全匹配(catch-all)”的備選項

2、 常量模型 僅匹配自身,任何字面量都可以用作常量

3、 變量模式 類似於通配模式,它可以匹配任意對象。與通配符(_)不同的是,Scala把變量綁定在匹配的對象上。

4、 構造器模式 提供了深度匹配(deep match),如果備選項是樣本類,那麽構造器模式首先檢查對象是否為該備選項的樣本類實例,然後檢查對象的構造器參數是否符合額外提供的模式。

構造器模式不只檢查頂層對象是否壹致,還會檢查對象的內容是否匹配內層的模式。由於額外的模式自身可以形成構造器模式,因此可以使用它們檢查到對象內部的任意深度。

5、 序列模式 可以像匹配樣本類那樣匹配如List或者Array這樣的序列類型。

6、 元組模式 匹配元祖

7、 類型模式 可以當做類型測試和類型轉換的簡易替代。

帶有 case 修飾符的類稱為樣本類(case class)。這種修飾符可以讓Scala編譯器自動為妳的類添加壹些句法上的便捷性。

這些便捷性的代價就是必須寫 case 修飾符並且樣本類和對象都因為附加的方法及對於每個構造器參數添加了隱含的字段而變得大了壹點。

樣本類是壹種特殊的類,它經過優化以被用於模式匹配。

封閉類除了類定義所在的文件之外不能再添加任何新的子類。其用於模式匹配的另外壹個作用是,當妳用樣本類來做模式匹配是,妳可能想讓編譯器幫妳確保妳已經列出了所有可能的選擇。為了達到這個目的,妳需要將樣本類的通用超類聲明為 sealed 。如果妳使用繼承自封閉類的樣本類做匹配,編譯器將通過通知警告信息標識出缺失的模式組合。

舉個例子:

如果想要讓編譯器不進行警告提示的話,需要給匹配的選擇器表達式添加 @unchecked 註解。

像是這樣 def describe(a: Amount): String = (a: @unchecked) match { 。

如果某個類是封閉的,那麽在編譯器所有子類就是可知的,因而編譯器可以檢查模式語句的完整性。讓所有(同壹組)樣本類都擴展某個封閉類或特質是個好的做法。

標準類庫中的Option類型用樣本類來表示那種可能存在、也可能不存在的值。可以是Some(value)的形式,其中value是實際的值;也可以是None對象,代表缺失的值。

Scala集合類的某些標準操作會產生可選值。例如Scala的Map的get方法會發現了指定鍵的情況下產生Some(value),在沒有找到指定鍵的時候產生None。

舉例如下:

樣本類None的形式比空字符串的意圖更加清晰,比使用null來表示缺少某值的做法更加安全。

Option支持泛型。舉例來說,Some(Paris)的類型為Option[String]。

分離可選值最通用的辦法是通過模式匹配的方式,舉例如下:

Scala鼓勵對Option的使用以說明值是可選的。這種處理可選值的方式有若幹超越Java的優點。

話說模式匹配(1): 什麽是模式?

  • 上一篇:Php源代碼社會化
  • 下一篇:海島部隊的生活資料
  • copyright 2024編程學習大全網