使用Scala 2.11.8,我可以通过以下方式将key - value
对添加到地图中:
scala> Map( (1 -> 1) ) + (2 -> 2)
res8: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1, 2 -> 2)
但是我如何使用元组作为+
的参数?
scala> Map( (1 -> 1) ) + (2, 2)
<console>:12: error: type mismatch;
found : Int(2)
required: (Int, ?)
Map( (1 -> 1) ) + (2, 2)
^
这也不起作用:
scala> Map( (1, 1) ) + (2, 2)
<console>:12: error: type mismatch;
found : Int(2)
required: (Int, ?)
Map( (1, 1) ) + (2, 2)
^
<console>:12: error: type mismatch;
found : Int(2)
required: (Int, ?)
Map( (1, 1) ) + (2, 2)
^
Map#+的签名是:
+(kv: (A, B)): Map[A, B]
,所以我不确定它为什么不起作用。
修改
scala> Map( (1,1) ).+( (2, 2) )
res0: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1, 2 -> 2)
有效,但为什么不上述?
答案 0 :(得分:6)
在Scala中,任何二进制操作(*
,+
等)实际上都是操作中第一个元素的类的方法。
因此,例如,2 * 2
相当于2.*(2)
,因为*
只是类Int
的一种方法。
键入Map( (1 -> 1) ) + (2, 2)
时发生的情况是Scala认识到您正在使用+
类的Map
方法。但是它认为您正在尝试将多个值传递给此方法,因为它默认将开头paren解释为参数列表的开头(这是(合理的)设计决策)。
解决这个问题的方法是将元组包装在另一对parens中或使用->
语法(使用parens,因为运算符优先级。)
scala> Map( (1 -> 1) ) + ((2, 2))
res0: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1, 2 -> 2)
scala> Map( (1 -> 1) ) + (2 -> 2)
res1: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1, 2 -> 2)