Scala提取器

Scala中的提取器是一個擁有稱為unapply方法,並使用unapply方法作為其成員之一的對象。 該unapply方法的目的是匹配一個值並將其分開。 通常,提取器對象還定義了一種用於構建值的雙重方法,但這不是必需的。

示例

下麵舉個例子來定義applyunapply方法。apply方法與Test轉換為可應用於括弧中的參數的對象,與apply方法相同。所以可以寫Test(“Maxsu”,“gmail.com”)來構造字串Maxsu@gmail.com

unapply方法是將Test類轉換為提取器,並反轉了應用的構建過程。在應用兩個字串,並形成一個電子郵件地址字串,取消應用接收電子郵件地址並返回潛在的兩個字串:地址的用戶和域。

語法

unapply("Maxsu@gmail.com") equals Some("Maxsu", "gmail.com")
unapply("Maxsu Ali") equals None

以下示例程式顯示電子郵件地址的提取對象。

object Demo {
   def main(args: Array[String]) {
      println ("Apply method : " + apply("Maxsu", "gmail.com"));
      println ("Unapply method : " + unapply("Maxsu@gmail.com"));
      println ("Unapply method : " + unapply("Maxsu 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中,使用以下命令編譯和執行此程式。

D:\>scalac Demo.scala
D:\>scala Demo
Apply method : Maxsu@gmail.com
Unapply method : Some((Maxsu,gmail.com))
Unapply method : None

抽取器模式匹配

當一個類的實例後跟括弧為零個或多個參數的列表時,編譯器會調用該實例上的apply方法。 可以在對象和類中定義apply方法。

如上所述,unapply方法的目的是提取正在尋找的特定值。當使用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中,使用以下命令編譯和執行此程式。

D:\>scalac Demo.scala
D:\>scala Demo
10
10 is bigger two times than 5

上一篇: Scala異常處理 下一篇: Scala檔I/O