为什么Map' s +运算符需要双括号?

时间:2014-07-13 09:20:51

标签: scala

例如:

val m = Map[Int, Int]()
m + (1, 1) // doesn't work!
m + ((1, 1)) // works!

我知道(1, 1)Tuple2,但那么前者为何不起作用?我可以避免这种古怪的双括号吗?

3 个答案:

答案 0 :(得分:6)

m + (1, 1)m.+(1, 1)是一回事,也就是说,它是一个带有两个整数参数的函数调用,而不是一个带有单个Tuple2参数的调用。

然而,你可以使用->形成一个没有括号的元组:

val m = Map[Int, Int]()
m + 1 -> 1 // works!

或者可能更有用:

var m = Map[Int, Int]()
m += 1 -> 1 // works!

答案 1 :(得分:2)

您的脚本无法正常工作,因为您尝试使用的方法并不存在。在您的情况下,Scala认为您希望将函数+与两个参数(IntInt)一起使用而不是一个(Tuple2)。

解决问题的最佳方法是使用->运算符。以下是示例代码:

scala> val m = Map[Int, Int]()
m: scala.collection.immutable.Map[Int,Int] = Map() 
scala> m + (1 -> 1)
res0: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1)

答案 2 :(得分:2)

m + (1, 1)的情况下,Scala认为你想用2个参数调用方法+,即m.+(1, 1),并且因为这种方法不存在而失败。

当编译器对传递的参数数量毫无疑问时,你可以用这种方式编写它:

如前所述:

m + (1 -> 1)

val m = Map[Int, Int]() val t = (1, 1) m + t

相关问题