English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

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 および unapply メソッド。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 の2倍!