2013-07-20 16 views
8

Dlaczego to działa:Zwiększanie wartości Scala mapie

val x = Map[Int,Int]() 
val y = (1, 0) 
x + y 

ale nie jest?

val x = Map[Int,Int]() 
x + (1, 0) 

Błąd produkowany jest:

<console>:11: error: type mismatch; 
found : Int(1) 
required: (Int, ?) 
      x + (1,0) 
      ^

Gdybym miał wejść (1,0) do REPL, że prawidłowo typy to jak (Int,Int).

należy dodać, że to działa prawidłowo:

x + (1 -> 0) 

Odpowiedz

6

Jest to dwuznaczność spowodowana podobieństwem pomiędzy notacją za krotki i ten dla list parametrów:

x + (1,0) jest zapis dla x.+(1,0), ale niestety nie ma metody na x, która ma dwa parametry: Int. To, czego chcesz, to x.+((1,0)), czyli x + ((1,0)).

W programie Scala jest coś o nazwie auto-tupling, patrz this question and answers, które przepisuje na przykład println (1,2) na println((1,2)). Poza tym to nie zadziała, ponieważ metoda + przyjmuje zmienną liczbę argumentów, a nie jedną taką jak println.

Otrzymujesz ten dziwny komunikat o błędzie, ponieważ oczekuje się, że każda wartość na liście parametrów (1,0) będzie krotką, jak w myMap + ((1,2), (1,3), (3,4)). Znajduje Int zamiast (Int, Int), stąd błąd.

+0

Dziękuję za wspaniałe wyjaśnienie, które pasuje do odpowiedzi! – kanielc

2

dodać kolejną parę nawiasów, aby to działało:

val x = Map[Int,Int]() 
x + ((1, 0)) 
Powiązane problemy