Scala 抽出子(Extractor)

抽出子は、渡されたオブジェクトからそのオブジェクトを構築するパラメータを抽出します。

Scala 標準ライブラリにはいくつかの定義済み抽出子が含まれています。それらについて大まかに見ていきます。

Scala の抽出子は unapply メソッドを持つオブジェクトです。unapply メソッドは apply メソッドの逆の操作と考えることができます。unapply はオブジェクトを受け取り、そのオブジェクトから値を抽出します。抽出された値は通常、そのオブジェクトを構築するために使用された値です。

以下の例は、メールアドレスの抽出子オブジェクトを示しています。

例

object Test {
   def main(args: Array[String]) {
     
      println ("Apply メソッド : " + apply("Zara", "gmail.com"));
      println ("Unapply メソッド : " + unapply("[email protected]"));
      println ("Unapply メソッド : " + unapply("Zara Ali"));

   }
   // 注入メソッド (オプション)
   def apply(user: String, domain: String) = {
      user +"@"+ domain
   }

   // 抽出メソッド(必須)
   def unapply(str: String): Option[(String, String)] = {
      val parts = str split "@"
      if (parts.length == 2){
         Some(parts(0), parts(1))
      }else{
         None
      }
   }
}

上記のコードを実行すると、出力結果は次のようになります。

$ scalac Test.scala 
$ scala Test
Apply 方法 : [email protected]
Unapply 方法 : Some((Zara,gmail.com))
Unapply 方法 : None

上記のオブジェクトは2つのメソッドを定義しています。applyとunapplyapply メソッド。apply メソッドを使用すると、new 操作を使用せずにオブジェクトを作成できます。したがって、文 Test("Zara", "gmail.com") で文字列 "[email protected]" を構築できます。

unapply メソッドは apply メソッドの逆の操作と考えることができます。unapply はオブジェクトを受け取り、そのオブジェクトから値を抽出します。抽出された値は通常、そのオブジェクトを構築するために使用された値です。この例では、Unapply メソッドを使用して、オブジェクトからユーザー名とメールアドレスのサフィックスを抽出しています。

この例では、unapply メソッドは、渡された文字列がメールアドレスでない場合に None を返します。コードは次のとおりです。

unapply("[email protected]") 相等于 Some("Zara", "gmail.com")
unapply("Zara Ali") 相等于 None

抽出子を使用したパターンマッチング

クラスをインスタンス化するとき、0個以上のパラメータを指定できます。コンパイラはインスタンス化の際に apply メソッドを呼び出します。apply メソッドはクラスとオブジェクトの両方で定義できます。

前述したように、unapply は指定された検索値を抽出するために使用され、apply とは逆の操作を行います。抽出子オブジェクトで match 文を使用すると、unapply が自動的に実行されます。以下に示します。

例

object Test {
   def main(args: Array[String]) {
     
      val x = Test(5)
      println(x)

      x match
      {
         case Test(num) => println(x + " は " + num + " の2倍です!")
         // unapply が呼び出されます
         case _ => println("計算できません")
      }

   }
   def apply(x: Int) = x*2
   def unapply(z: Int): Option[Int] = if (z%2==0) Some(z/2) else None
}

上記のコードを実行すると、出力結果は次のようになります。

$ scalac Test.scala 
$ scala Test
10
10 是 5 的两倍!
その他の拡張