Extracteur Scala


L'extracteur extrait les paramètres utilisés pour construire l'objet à partir de l'objet qui lui est passé.

La bibliothèque standard Scala contient des extracteurs prédéfinis, nous allons les examiner brièvement.

Un extracteur Scala est un objet avec une méthode de désapplication. La méthode unapply est l'opération inverse de la méthode apply : unapply accepte un objet puis extrait la valeur de l'objet. La valeur extraite est généralement la valeur utilisée pour construire l'objet.

L'exemple suivant montre l'objet extracteur de l'adresse e-mail :

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
      }
   }
}

Exécutez le code ci-dessus, le résultat de sortie est :

$ scalac Test.scala 
$ scala Test
Apply 方法 : Zara@gmail.com
Unapply 方法 : Some((Zara,gmail.com))
Unapply 方法 : None

L'objet ci-dessus définit deux méthodes : appliquer et désappliquer méthodes. Avec la méthode apply, nous pouvons créer des objets sans utiliser la nouvelle opération. Vous pouvez donc construire une chaîne "Zara@gmail.com" via l'instruction Test("Zara", "gmail.com").

La méthode unapply est l'opération inverse de la méthode apply : unapply accepte un objet puis extrait la valeur de l'objet. La valeur extraite est généralement la valeur utilisée pour construire l'objet. Dans l'exemple que nous utilisons La méthode Unapply extrait le suffixe du nom d'utilisateur et de l'adresse e-mail de l'objet.

La méthode unapply dans l'instance renvoie None lorsque la chaîne entrante n'est pas une adresse e-mail. La démonstration du code est la suivante :

unapply("Zara@gmail.com") 相等于 Some("Zara", "gmail.com")
unapply("Zara Ali") 相等于 None

L'extracteur utilise la correspondance de modèles

Lorsque nous instancions une classe, nous pouvons apporter 0 ou plusieurs paramètres, et le compilateur l'instanciera. La méthode sera appelée. Nous pouvons définir la méthode apply dans les classes et les objets.

Comme nous l'avons mentionné précédemment, unapply est utilisé pour extraire la valeur que nous spécifions rechercher, ce qui est l'opposé d'apply. Lorsque nous utilisons l'instruction match dans l'objet extracteur, unapply sera automatiquement exécuté comme suit :

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
}

En exécutant le code ci-dessus, le résultat de sortie est :

$ scalac Test.scala 
$ scala Test
10
10 是 5 的两倍!