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)