Scala Map,元组和函数参数列表之间的歧义

时间:2011-10-12 17:47:00

标签: function scala map tuples infix-notation

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 个答案:

答案 0 :(得分:9)

不幸的是a b (c, d, e, ..)去了a.b(c, d, e, ..)。因此错误。

答案 1 :(得分:3)

  

这不是明确的,因为我没有使用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)

换句话说,+=需要vararg。

答案 2 :(得分:2)

定义地图条目的首选方法是使用 - &gt;方法。像

m += ("foo" -> 2)

构造一个元组。 a - &gt; b变得糊涂了.-&gt;(b)。 scala中的每个对象都有一个 - &gt;方法