2009-09-08 12 views
9

Wenn Sie den folgenden Code in scala SchreibenEinlesefehler von verschachtelten Tupeln in scala

var m = Map((0,1) -> "a") 
m += ((0,2), "b") // compilation error 

Ich erhalte den Fehler

 
type mismatch; 
found : Int(0) 
required: (Int, Int) 

jedoch das Ändern der Syntax des Tupels (X,Y)-(X -> Y) Werke

var m = Map((0,1) -> 'a) 
m += ((0,2) -> 'b) // compiles file 

obwohl

((0,1).getClass == (0 -> 1).getClass) // is true 
(0,1).isInstanceOf[Tuple2[_,_]] && (0 -> 1).isInstanceOf[Tuple2[_,_]] // both true 

Warum ist das? Was hält Scala von meinem verschachtelten Tupel?

+0

I * immer * die gleichen Fehler machen –

Antwort

10

Der Grund ist ziemlich einfach (glaube ich) und hat mit der Tatsache, dass (auf der Map Zug) zu tun:

m += (a -> b) 

ist eine Abkürzung für:

m = m.+(t2) //where t2 is of type Tuple2[A,B] 

Natürlich, wenn Sie verwenden ein Komma in dem ersten Beispiel wird Scala dies interpretiert als ein Aufruf die Methode zu sein:

m = m.+(a, b) 

Diese Methode existiert nicht auf der Map Eigenschaft. Methodenaufrufregeln bedeuten, dass a -> b zuerst ausgewertet wird (zu Tuple2) und daher die richtige Methode aufgerufen wird. Hinweis: ein zusätzliches Paar von Klammern verwenden funktioniert gut:

m += ((a,b)) //works just fine but less readable 
+0

Ich war eigentlich ziemlich sicher, dass Obj Op Pred zu Pred.Op entspricht ((pred)) bereits. Gibt es eine Verwendung (in der Standardbibliothek oder Lift) zum Aufrufen einer Funktion mit zwei Argumenten als Operator? (Ein Beispiel, das natürlich Sinn macht, kann man immer "array update (x, y)" aber es sieht einfach komisch aus. –

+0

Ich stimme dir zu Elazar. Ich denke, dass der Compiler hier etwas mehr Sinn haben sollte –

0

Oxbow korrekt ist. Sie können eine andere Klammer verwenden, um Mehrdeutigkeiten, aber:

m += (((0,2), "b")) 
+0

glaube ich Ich wies darauf hin, dass die zusätzlichen Klammern das Problem gelöst haben –

Verwandte Themen