Scala-Extraktor

Ein Extraktor extrahiert aus dem ihm übergebenen Objekt die Argumente, mit denen ein Objekt konstruiert wurde.

Die Scala-Standardbibliothek enthält einige vordefinierte Extraktoren, und wir werden sie uns kurz ansehen.

Ein Scala-Extraktor ist ein Objekt mit einer unapply-Methode. Die unapply-Methode ist die Umkehrung der apply-Methode: unapply nimmt ein Objekt und extrahiert Werte daraus, und die extrahierten Werte sind normalerweise diejenigen, die zum Konstruieren des Objekts verwendet wurden.

Das folgende Beispiel demonstriert ein Extraktor-Objekt für E-Mail-Adressen:

Beispiel

object Test {
   def main(args: Array[String]) {
     
      println ("Apply method : " + apply("Zara", "gmail.com"));
      println ("Unapply method : " + unapply("[email protected]"));
      println ("Unapply-Methode : " + unapply("Zara Ali"));

   }
   // Injektionsmethode (optional)
   def apply(user: String, domain: String) = {
      user +"@"+ domain
   }

   // Extraktionsmethode (erforderlich)
   def unapply(str: String): Option[(String, String)] = {
      val parts = str split "@"
      if (parts.length == 2){
         Some(parts(0), parts(1))
      }else{
         Keine
      }
   }
}

Das Ausführen des obigen Codes erzeugt die folgende Ausgabe:

$ scalac Test.scala 
$ scala Test
Apply 方法 : [email protected]
Unapply 方法 : Some((Zara,gmail.com))
Unapply 方法 : None

Das obige Objekt definiert zwei Methoden:applyundunapplyDie apply-Methode. Durch die apply-Methode können wir Objekte erstellen, ohne den new-Operator zu verwenden. So können Sie eine Zeichenkette "[email protected]" mit der Anweisung Test("Zara", "gmail.com") konstruieren.

Die unapply-Methode ist die Umkehrung der apply-Methode: unapply nimmt ein Objekt und extrahiert Werte daraus, und die extrahierten Werte sind normalerweise diejenigen, die zum Konstruieren des Objekts verwendet wurden. Im Beispiel verwenden wir die unapply-Methode, um den Benutzernamen und das Domänensuffix der E-Mail-Adresse aus dem Objekt zu extrahieren.

Im Beispiel gibt die unapply-Methode None zurück, wenn die übergebene Zeichenkette keine E-Mail-Adresse ist. Der Code wird wie folgt demonstriert:

unapply("[email protected]") 相等于 Some("Zara", "gmail.com")
unapply("Zara Ali") 相等于 None

Extraktoren verwenden Musterabgleich

Wenn wir eine Klasse instanziieren, können wir null oder mehr Parameter übergeben, und der Compiler ruft während der Instanziierung die apply-Methode auf. Wir können die apply-Methode sowohl in der Klasse als auch im Objekt definieren.

Wie bereits erwähnt, wird unapply verwendet, um die Werte zu extrahieren, die wir suchen möchten, und es ist das Gegenteil von apply. Wenn wir eine match-Anweisung in einem Extraktor-Objekt verwenden, wird unapply automatisch ausgeführt, wie unten gezeigt:

Beispiel

object Test {
   def main(args: Array[String]) {
     
      val x = Test(5)
      println(x)

      x Treffer
      {
         case Test(num) => println(x + " ist " + num + " zweimal! ")
         // unapply wird aufgerufen
         case _ => println("Kann nicht berechnen")
      }

   }
   def apply(x: Int) = x*2
   def unapply(z: Int): Option[Int] = if (z%2==0) Some(z/2) else None
}

Das Ausführen des obigen Codes erzeugt die folgende Ausgabe:

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