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

Scala 提取器(Extractor)

Un extracteur extrait les paramètres nécessaires pour construire l'objet passé à son argument.

La bibliothèque standard Scala contient quelques extracteurs prédéfinis, nous allons les découvrir en bref.

L'extracteur Scala est un objet avec une méthode unapply. La méthode unapply est une opération inverse de la méthode apply : unapply accepte un objet, puis extrait les valeurs de l'objet. Les valeurs extraites sont généralement utilisées pour construire les valeurs de l'objet.

Les exemples suivants montrent l'objet extraiteur d'adresse e-mail :

object Test {
   def main(args: Array[String]) {
      
      println("Méthode Apply : ", + apply("Zara", "gmail.com"));
      println("Méthode Unapply : ", + unapply("[email protected]"));
      println("Méthode Unapply : ", + unapply("Zara Ali"));
   }
   // Méthode d'injection (optionnelle)
   def apply(user: String, domain: String) = {
      user +"@"+ domain
   }
   // Méthode d'extraction (obligatoire)
   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
Méthode Apply : [email protected]
Méthode Unapply : Some((Zara,gmail.com))
Méthode Unapply : None

Les objets ci-dessus définissent deux méthodes : apply et unapply La méthode. Grâce à la méthode apply, nous n'avons pas besoin d'utiliser l'opération new pour créer des objets. Donc, vous pouvez utiliser l'expression Test("Zara", "gmail.com") pour construire la chaîne de caractères "[email protected]".

La méthode unapply est une opération inverse de la méthode apply : unapply accepte un objet, puis extrait les valeurs de l'objet. Les valeurs extraites sont généralement utilisées pour construire les valeurs de l'objet. Dans l'exemple, nous utilisons La méthode unapply extrait le nom d'utilisateur et le suffixe de l'adresse e-mail à partir de l'objet.

L'exemple montre que la méthode unapply retourne None lorsque la chaîne de caractères fournie n'est pas une adresse e-mail. Voici un exemple de code :

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 + "的两倍!")
         //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 的两倍!