2009-09-08 9 views
9

Pisząc następujący kod w Scalabłąd składni zagnieżdżonych krotek w Scala

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

Dostaję błąd

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

Jednak zmienia składnia krotki z (X,Y) do (X -> Y) prac

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

Mimo że

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

Dlaczego tak jest? Co scala myśli o mojej zagnieżdżonej krotce?

+0

I * zawsze * popełnić tego samego błędu –

Odpowiedz

10

Powód jest dość prosty (chyba) i ma do czynienia z faktem, że (na cechy Map):

m += (a -> b) 

jest skrótem dla:

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

oczywiście jeśli używasz przecinek w pierwszym przykładzie, Scala zinterpretuje to jako wezwanie do metody:

m = m.+(a, b) 

Ta metoda nie istnieje na cechę Map. Reguły wywoływania metod oznaczają, że najpierw jest oceniany (do), a stąd wywoływana jest poprawna metoda. Uwaga: Korzystanie dodatkową parę nawiasów działa dobrze:

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

I był rzeczywiście pewien, że Obj Op Pred jest równoważna Pred.Op ((Pred)) już. Czy istnieje zastosowanie (w bibliotece standardowej lub Lift) do wywoływania funkcji z dwoma argumentami jako operator? (Przykład, który ma sens oczywiście, zawsze możesz zrobić "aktualizację tablicy (x, y)", ale to wygląda dziwnie –

+0

Zgadzam się z tobą Elazar.Myślę, że kompilator powinien mieć nieco więcej sensu tutaj –

0

Oxbow jest poprawna. Można użyć innego nawias do dwuznaczności, choć:

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

Wierzę Zwróciłem uwagę, że dodatkowe nawiasy rozwiązały problem –

Powiązane problemy