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

Scala 提取器(Extractor)

Ein Extraktor extrahiert Parameter aus dem Objekt, das an ihn übergeben wird, um es zu konstruieren.

Die Scala-Bibliothek enthält einige vordefinierte Extraktoren, und wir werden sie grob kennenlernen.

Ein Scala-Extraktor ist ein Objekt mit der Methode unapply. Die Methode unapply ist eine umgekehrte Operation der Methode apply: unapply nimmt ein Objekt an, extrahiert dann Werte aus dem Objekt und die extrahierten Werte werden normalerweise verwendet, um den Wert des Objekts zu konstruieren.

Das folgende Beispiel zeigt den Extraktor-Objekt für E-Mail-Adressen:

object Test {
   def main(args: Array[String]) {
      
      println ("Apply Methode : " + apply("Zara", "gmail.com"));
      println ("Unapply Methode : " + unapply("[email protected]"));
      println ("Unapply Methode : " + unapply("Zara Ali"));
   }
   // Injektionsmethode (optional)
   def apply(user: String, domain: String) = {
      user +"@"+ domain
   }
   // Extraktionsmethode (obligatorisch)
   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 Methode : [email protected]
Unapply Methode : Some((Zara,gmail.com))
Unapply Methode : None

Die folgenden Objekte definieren zwei Methoden: apply und unapply Methode. Mit der apply-Methode müssen wir den new-Operator nicht verwenden, um ein Objekt zu erstellen. Daher können Sie die Anweisung Test("Zara", "gmail.com") verwenden, um den String "[email protected]" zu konstruieren.

Die unapply-Methode ist eine umgekehrte Operation der apply-Methode: unapply nimmt ein Objekt an, extrahiert dann Werte aus dem Objekt und die extrahierten Werte werden normalerweise verwendet, um den Wert des Objekts zu konstruieren. Im Beispiel verwenden wir Die unapply-Methode extrahiert den Benutzernamen und den Suffix der E-Mail-Adresse aus dem Objekt.

Das unapply-Methode gibt None zurück, wenn der übergebene String keine E-Mail-Adresse ist. Der Code-Demonstration ist wie folgt:

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 的两倍!