8
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.+=

4

3 回答 3

10

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

于 2011-10-12T17:54:43.013 回答
4

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

换句话说,+=需要一个可变参数。

于 2011-10-12T21:21:50.523 回答
2

定义映射条目的首选方法是使用 -> 方法。像

m += ("foo" -> 2)

它构造了一个元组。a -> b 被脱糖为 a.->(b)。scala 中的每个对象都有一个 -> 方法。

于 2011-10-12T18:08:27.620 回答