Im zweiten Code-Snippet wird die Mustererkennung verwendet, um die Bewertung durchzuführen.
Auf den Folgecode übersetzt wird:
val Tuple(A, B) = Tuple2(2,3)
Wenn Scala Pattern-Matching tun, variable beginnt mit einem Großbuchstaben in dem Muster als konstanten Wert (oder Singleton Object) betrachtet wird, so val (a, b) = (2, 3)
Werke aber nicht val (A, B) = (2, 3)
.
BTW, Ihr erstes Code-Snippet verwendet keine Mustererkennung, es ist nur eine gewöhnliche Variablenzuweisung.
Wenn Sie Tuple1
explizit verwenden, wird es denselben Fehler haben. Hier
scala> val Tuple1(Z) = Tuple1(3)
<console>:7: error: not found: value Z
val Tuple1(Z) = Tuple1(3)
ist etwas interessantes Beispiel:
scala> val A = 10
A: Int = 10
scala> val B = 20
B: Int = 20
scala> val (A, x) = (10, 20)
x: Int = 20
scala> val (A, x) = (10, 30)
x: Int = 30
scala> val (A, x) = (20, 20)
scala.MatchError: (20,20) (of class scala.Tuple2$mcII$sp)
at .<init>(<console>:9)
at .<clinit>(<console>)
Es hat etwas zu tun mit 'A' und 'B' als„stabil Bezeichner“Ich denke, identifiziert. Versuchen Sie: 'val (a, b) = (1, 2)', was gültig ist. Versuchen Sie dies auch zu sehen: 'val (String, Int) = (1, 2)', die interessante Nachrichten hat :) Ich bin mir nicht sicher, wo/wenn das definiert ist, aber ich * denke * es wäre unter der "Übereinstimmung" und "Mustervergleich" im SLS. Insbesondere dort, wo es darum geht, wie es funktioniert, wenn es "unapply" nennt. –
mögliches Duplikat von [Mehrfachzuweisung über Mustervergleich mit Array funktioniert nicht mit Großbuchstaben Vals] (http://stackoverflow.com/questions/8204219/multiple-assignment-via-pattern-matching-with-array-is-not- working-with-uppercas) –
@pst Können wir das gleiche mit 'var' machen? In Java können wir 'int a, b, c;' machen. In Scala möchte ich 'var (a, b, c): Int', was nicht funktioniert. – Jus12