Scala - Extraktoren
Ein Extraktor in Scala ist ein Objekt mit einer Methode namens unapplyals eines seiner Mitglieder. Der Zweck dieser nicht angewendeten Methode besteht darin, einen Wert abzugleichen und auseinanderzunehmen. Oft definiert das Extraktorobjekt auch eine duale Methodeapply für Gebäudewerte, aber dies ist nicht erforderlich.
Beispiel
Nehmen wir ein Beispiel für ein Objekt, das beides definiert apply und unapplyMethoden. Die Methode apply hat dieselbe Bedeutung wie immer: Sie verwandelt Test in ein Objekt, das auf Argumente in Klammern angewendet werden kann, genauso wie eine Methode angewendet wird. Sie können also Test ("Zara", "gmail.com") schreiben, um die Zeichenfolge "[email protected]" zu erstellen.
Das unapply Methode ist, was Test Klasse in eine verwandelt extractor und es kehrt den Bauprozess von um apply. Wenn "Apply" zwei Zeichenfolgen verwendet und daraus eine E-Mail-Adresszeichenfolge bildet, nimmt "Unapply" eine E-Mail-Adresse und gibt möglicherweise zwei Zeichenfolgen zurück: dieuser und die domain der Adresse.
Das unapplymuss auch den Fall behandeln, in dem die angegebene Zeichenfolge keine E-Mail-Adresse ist. Aus diesem Grund gibt unapply einen Optionstyp über Zeichenfolgenpaare zurück. Das Ergebnis ist entwederSome (user, domain)Wenn die Zeichenfolge str eine E-Mail-Adresse mit den angegebenen Benutzer- und Domänenteilen ist, oder Keine, wenn str keine E-Mail-Adresse ist. Hier sind einige Beispiele wie folgt.
Syntax
unapply("[email protected]") equals Some("Zara", "gmail.com")
unapply("Zara Ali") equals None
Das folgende Beispielprogramm zeigt ein Extraktionsobjekt für E-Mail-Adressen.
Beispiel
object Demo {
def main(args: Array[String]) {
println ("Apply method : " + apply("Zara", "gmail.com"));
println ("Unapply method : " + unapply("[email protected]"));
println ("Unapply method : " + unapply("Zara Ali"));
}
// The injection method (optional)
def apply(user: String, domain: String) = {
user +"@"+ domain
}
// The extraction method (mandatory)
def unapply(str: String): Option[(String, String)] = {
val parts = str split "@"
if (parts.length == 2){
Some(parts(0), parts(1))
} else {
None
}
}
}
Speichern Sie das obige Programm in Demo.scala. Die folgenden Befehle werden zum Kompilieren und Ausführen dieses Programms verwendet.
Befehl
\>scalac Demo.scala
\>scala Demo
Ausgabe
Apply method : [email protected]
Unapply method : Some((Zara,gmail.com))
Unapply method : None
Mustervergleich mit Extraktoren
Wenn auf eine Instanz einer Klasse Klammern mit einer Liste von null oder mehr Parametern folgen, ruft der Compiler die auf applyMethode auf dieser Instanz. Wir können anwenden sowohl in Objekten als auch in Klassen definieren.
Wie oben erwähnt, ist der Zweck der unapplyMethode ist es, einen bestimmten Wert zu extrahieren, den wir suchen. Es macht den umgekehrten Vorgangapplytut. Beim Vergleichen eines Extraktorobjekts mit demmatch Aussage der unapply Methode wird automatisch ausgeführt.
Versuchen Sie das folgende Beispielprogramm.
Beispiel
object Demo {
def main(args: Array[String]) {
val x = Demo(5)
println(x)
x match {
case Demo(num) => println(x+" is bigger two times than "+num)
//unapply is invoked
case _ => println("i cannot calculate")
}
}
def apply(x: Int) = x*2
def unapply(z: Int): Option[Int] = if (z%2==0) Some(z/2) else None
}
Speichern Sie das obige Programm in Demo.scala. Die folgenden Befehle werden zum Kompilieren und Ausführen dieses Programms verwendet.
Befehl
\>scalac Demo.scala
\>scala Demo
Ausgabe
10
10 is bigger two times than 5