添加元组到地图?

时间:2016-10-24 14:45:16

标签: scala

使用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)

有效,但为什么不上述?

1 个答案:

答案 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)