English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Scala bietet ein mächtiges Musterabfrage-Mechanismus und wird auch breit eingesetzt.
Eine Musterabfrage besteht aus einer Reihe von Optionen, jede beginnt mit dem Schlüsselwort case。Jeder Option enthält ein Muster und eine bis mehrere Ausdrücke. Der Pfeil => Trennt Muster und Ausdrücke voneinander.
Hier ist ein einfaches Beispiel für eine Musterabfrage mit Integer-Werten:
object Test { def main(args: Array[String]) { println(matchTest(3)) } def matchTest(x: Int): String = x match { case 1 => "one" case 2 => "two" case _ => "many" } }
Führen Sie den obigen Code aus, die Ausgabe lautet:
$ scalac Test.scala $ scala Test many
Match entspricht dem switch in Java, aber wird nach dem Wählerausdruck geschrieben. D.h.: Wähler match {Optionen}.
Ein Match-Ausdruck führt die Berechnung durch, indem er jede Musterabfrage in der Reihenfolge ihrer Schreibweise versucht, und stoppt, sobald eine Übereinstimmung gefunden wird, ohne die verbleibenden Musterabfragen zu überprüfen.
Nun schauen wir uns ein Beispiel für eine Musterabfrage mit verschiedenen Datentypen an:
object Test { def main(args: Array[String]) { println(matchTest("two")) println(matchTest("test")) println(matchTest(1)) println(matchTest(6)) } def matchTest(x: Any): Any = x match { case 1 => "one" case "two" => 2 case y: Int => "scala.Int" case _ => "many" } }
Führen Sie den obigen Code aus, die Ausgabe lautet:
$ scalac Test.scala $ scala Test 2 many one scala.Int
Der erste case im Beispiel entspricht einem Integer-Wert 1Der zweite case entspricht dem String-Wert "two", der dritte case entspricht einem Typmuster, das verwendet wird, um zu bestimmen, ob der übergebene Wert ein Integer ist. Im Vergleich zur Verwendung von isInstanceOf zur Typbestimmung ist die Verwendung von Musterabfragen besser. Der vierte case stellt die Standard-Allpass-Option dar, d.h. der Eintrag, der verwendet wird, wenn keine anderen Übereinstimmungen gefunden werden, ähnlich wie der "default" in switch.
Klassen, die den Schlüsselwort 'case' verwenden, sind Beispielsklassen (case classes). Beispielsklassen sind eine spezielle Art von Klasse, die optimiert wurde, um Musterabfragen zu verwenden.
Hier ist ein einfaches Beispiel für eine Klasse:
object Test { def main(args: Array[String]) { val alice = new Person("Alice", 25) val bob = new Person("Bob", 32) val charlie = new Person("Charlie", 32) for (person <- List(alice, bob, charlie)) { person match { case Person("Alice", 25) => println("Hi Alice!") case Person("Bob", 32) => println("Hi Bob!") case Person(name, age) => println("Alter: " + age + " Jahr, Name: " + name + "?") } } } // Beispielklasse case class Person(name: String, age: Int) }
Führen Sie den obigen Code aus, die Ausgabe lautet:
$ scalac Test.scala $ scala Test Hi Alice! Hi Bob! Alter: 32 Jahr, Name: Charlie?
Bei der Erklärung eines Beispiels wird der folgende Prozess automatisch durchgeführt:
Jeder Parameter des Konstruktors wird zu val, es sei denn, er wird ausdrücklich als var deklariert, was jedoch nicht empfohlen wird;
Es wird eine apply-Methode im Begleiterobjekt bereitgestellt, sodass Objekte ohne Verwendung des new-Schlüsselworts erstellt werden können;
Stellen Sie die Methode unapply bereit, damit Musterpassungen funktionieren können;
Erzeugen Sie Methoden für toString, equals, hashCode und copy, es sei denn, die Definition dieser Methoden wird explizit angegeben.