
- Scala 教程
- Scala - 首頁
- Scala - 概述
- Scala - 特性
- Scala - 環境設定
- Scala - 構建工具 (SBT)
- Scala - 基本語法
- 資料型別和變數
- Scala - 資料型別
- Scala - 變數
- Scala - 字串
- Scala - 陣列
- Scala 運算子
- Scala - 運算子
- Scala - 算術運算子
- Scala - 關係運算符
- Scala - 邏輯運算子
- Scala - 位運算子
- Scala - 賦值運算子
- Scala 條件語句
- Scala - IF ELSE
- Scala 迴圈語句
- Scala - 迴圈語句
- Scala - while 迴圈
- Scala - do-while 迴圈
- Scala - for 迴圈
- Scala - break 語句
- Scala 類和物件
- Scala - 類和物件
- Scala - 訪問修飾符
- Scala 方法和函式
- Scala - 函式
- Scala - 按名稱呼叫函式
- Scala - 帶命名引數的函式
- Scala - 帶可變引數的函式
- Scala - 遞迴函式
- Scala - 預設引數值
- Scala - 高階函式
- Scala - 巢狀函式
- Scala - 匿名函式
- 部分應用函式
- Scala - Currying 函式
- Scala 集合
- Scala - 集合
- Scala - 列表
- Scala - 集合
- Scala - 對映
- Scala - 元組
- Scala - 迭代器
- Scala - 選項
- Scala 模式匹配
- Scala - 模式匹配
- Scala - 異常處理
- Scala - 提取器
- Scala - 正則表示式
- Scala 檔案 I/O
- Scala - 檔案 I/O
- Scala 高階概念
- Scala - 閉包
- Scala - 特性
- Scala 有用資源
- Scala - 快速指南
- Scala - 線上編譯器
- Scala - 有用資源
- Scala - 討論
Scala - 提取器
Scala 中的提取器是一個物件,它有一個名為 unapply 的方法作為其成員之一。該 unapply 方法的目的是匹配一個值並將其分解。通常,提取器物件還定義了一個對偶方法 apply 用於構建值,但這不是必需的。
示例
讓我們以一個定義了 apply 和 unapply 方法的物件為例。apply 方法的含義與往常一樣:它將 Test 轉換為可以應用於括號中引數的物件,就像應用方法一樣。因此,您可以編寫 Test("Zara", "gmail.com") 來構造字串 "Zara@gmail.com"。
unapply 方法是將 Test 類轉換為提取器的方法,它反轉了apply 的構造過程。在 apply 採用兩個字串並從中形成電子郵件地址字串的地方,unapply 採用電子郵件地址並返回可能兩個字串:地址的使用者和域名。
unapply 還必須處理給定字串不是電子郵件地址的情況。這就是為什麼 unapply 返回字串對的 Option 型別。其結果要麼是Some(user, domain),如果字串 str 是具有給定使用者和域名部分的電子郵件地址,要麼是 None,如果 str 不是電子郵件地址。以下是一些示例。
語法
unapply("Zara@gmail.com") equals Some("Zara", "gmail.com") unapply("Zara Ali") equals None
以下示例程式顯示了用於電子郵件地址的提取器物件。
示例
object Demo { def main(args: Array[String]) { println ("Apply method : " + apply("Zara", "gmail.com")); println ("Unapply method : " + unapply("Zara@gmail.com")); println ("Unapply method : " + unapply("Zara Ali")); } // The injection method (optional) def apply(user: String, domain: String) = { user +"@"+ domain } // The extraction method (mandatory) def unapply(str: String): Option[(String, String)] = { val parts = str split "@" if (parts.length == 2){ Some(parts(0), parts(1)) } else { None } } }
將上述程式儲存在 Demo.scala 中。以下命令用於編譯和執行此程式。
命令
\>scalac Demo.scala \>scala Demo
輸出
Apply method : Zara@gmail.com Unapply method : Some((Zara,gmail.com)) Unapply method : None
使用提取器的模式匹配
當類的例項後跟括號以及零個或多個引數的列表時,編譯器將在該例項上呼叫apply 方法。我們可以在物件和類中定義 apply。
如上所述,unapply 方法的目的是提取我們正在尋找的特定值。它執行與apply相反的操作。當使用match語句比較提取器物件時,將自動執行unapply方法。
嘗試以下示例程式。
示例
object Demo { def main(args: Array[String]) { val x = Demo(5) println(x) x match { case Demo(num) => println(x+" is bigger two times than "+num) //unapply is invoked case _ => println("i cannot calculate") } } def apply(x: Int) = x*2 def unapply(z: Int): Option[Int] = if (z%2==0) Some(z/2) else None }
將上述程式儲存在 Demo.scala 中。以下命令用於編譯和執行此程式。
命令
\>scalac Demo.scala \>scala Demo
輸出
10 10 is bigger two times than 5