Function Scala映射,元组和函数参数列表之间的歧义

Function Scala映射,元组和函数参数列表之间的歧义,function,scala,map,tuples,infix-notation,Function,Scala,Map,Tuples,Infix Notation,那么m+=(“foo”,2)不起作用怎么办?Scala给出了类型错误: 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 显然Scala认为我试图用两个参数而不是一个元组参数调用+=。为

那么
m+=(“foo”,2)
不起作用怎么办?Scala给出了类型错误:

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

显然Scala认为我试图用两个参数而不是一个元组参数调用
+=
。为什么?这不是很明确吗,因为我没有使用
m.+=

不幸的是
ab(c,d,e,…)
desugars到
a.b(c,d,e,…)
。因此出现了错误。

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

 error: type mismatch;
 found   : java.lang.String("foo")
 required: (String, Int)
       m += ("foo", 2)
             ^
它构造了一个元组。a->b被脱粘到a.->(b)。scala中的每个对象都有->方法

这不是很明确吗,因为我没有使用m.+=

不,它不是,因为当有多个参数时总是可以使用括号。例如:

m += ("foo" -> 2)

换句话说,
+=
需要一个vararg。

除此之外,这里还有一个解决方法
m+=(“foo”->2)
或者甚至
m+=“foo”->2
@Tempus:它是以这样的方式进行设计的,因为这就是语言的工作方式。关于这个决定的理由,我记得[scala user]上有一些帖子在讨论这个问题。我现在找不到它。如果我能找到那条线索,我会发布链接。你能引用正式的Scala文档来支持这一点吗?(这是出于设计还是被认为是一个bug?@DanBurton:请参阅第85页,顶部项目符号后的第一段。Scala 2.13的相应参考是可以在开放的参数参数激怒我之前自由添加空格>,
List(1, 2, 3) mkString ("<", ", ", ">")
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)