Scala Map, неоднозначность между кортежем и списком аргументов функций - PullRequest
7 голосов
/ 12 октября 2011
val m = scala.collection.mutable.Map[String, Int]()
// this doesn't work
m += ("foo", 2)
// this does work
m += (("foo", 2))
// this works too
val barpair = ("bar", 3)
m += barpair

Так в чем же дело с m += ("foo" , 2) не работает?Scala выдает ошибку типа:

 error: type mismatch;
 found   : java.lang.String("foo")
 required: (String, Int)
       m += ("foo", 2)
             ^

Очевидно, что Scala считает, что я пытаюсь вызвать += с двумя аргументами вместо одного аргумента кортежа.Зачем?Разве это не однозначно, так как я не использую m.+=?

Ответы [ 3 ]

9 голосов
/ 12 октября 2011

К сожалению a b (c, d, e, ..) десугаров до a.b(c, d, e, ..). Отсюда и ошибка.

3 голосов
/ 13 октября 2011

Разве это не однозначно, поскольку я не использую m. + =?

Нет, это не так, потому что круглые скобки всегда можно использовать при наличии нескольких аргументов.Например:

List(1, 2, 3) mkString ("<", ", ", ">")

Итак, вы можете спросить, , что несколько параметров ?Ну, документация по Scala API - ваш друг (или, по крайней мере, мой), поэтому я представляю вам:

scala> val m = scala.collection.mutable.Map[String, Int]()
m: scala.collection.mutable.Map[String,Int] = Map()

scala> m += (("foo", 2), ("bar", 3))
res0: m.type = Map(bar -> 3, foo -> 2)

Другими словами, += принимает переменную.

2 голосов
/ 12 октября 2011

Предпочтительным способом определения записей на карте является использование метода ->.Как

m += ("foo" -> 2)

, который создает кортеж.a -> b переводится в a .-> (b).У каждого объекта в scala есть метод ->.

...