2012-04-06 9 views
7
val A = 3 
val (A) = (3) 

Beide korrekt. Aber:`val (A) = (3)` ist richtig, aber `val (A, B) = (2,3)` kann nicht kompiliert werden, warum?

val (A,B) = (2,3) 

kann nicht kompiliert werden:

scala> val (A,B) = (2,3) 
<console>:7: error: not found: value A 
     val (A,B) = (2,3) 
      ^
<console>:7: error: not found: value B 
     val (A,B) = (2,3) 
      ^

Warum?

+4

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. –

+0

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) –

+0

@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

Antwort

13

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>) 
+0

'val A = 1' ist kein Mustervergleich? Probiere 'val 1 = 2' – Freewind

+0

Ich meine' 'val (A) = (3)' 'ist kein Mustervergleich wie' 'val (A, B) = (2, 3)' ', es wird zum selben Bytecode kompiliert als "val A = 3". –

Verwandte Themen