スカラエクストラクター


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

Scala 標準ライブラリには、いくつかの事前定義されたエクストラクターが含まれています。それらについて簡単に見ていきます。

Scala エクストラクターは、una​​pply メソッドを持つオブジェクトです。 unapply メソッドは apply メソッドの逆の操作です。unapply はオブジェクトを受け入れ、オブジェクトから値を抽出します。通常、抽出された値はオブジェクトの構築に使用されます。

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

object Test {
   def main(args: Array[String]) {
      
      println ("Apply 方法 : " + apply("Zara", "gmail.com"));
      println ("Unapply 方法 : " + unapply("Zara@gmail.com"));
      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 方法 : Zara@gmail.com
Unapply 方法 : Some((Zara,gmail.com))
Unapply 方法 : None

上記のオブジェクトは、2 つのメソッド: apply メソッドと unapply メソッドを定義します。 。 apply メソッドを使用すると、new 操作を使用せずにオブジェクトを作成できます。したがって、ステートメント Test("Zara", "gmail.com") を通じて文字列 "Zara@gmail.com" を構築できます。

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

インスタンスの unapply メソッドは、受信文字列が電子メール アドレスではない場合、None を返します。コードのデモは次のとおりです:

unapply("Zara@gmail.com") 相等于 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 + " 的两倍!")
         //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 的两倍!