斯卡拉:奇怪的是加入了一张地图

时间:2012-01-17 20:25:41

标签: scala map

我刚刚注意到,虽然我需要在地图中添加一对时澄清一些parens,但在重新分配时我并不需要它们:

Welcome to Scala version 2.9.1.final (Java HotSpot(TM) Server VM, Java 1.6.0_18).
Type in expressions to have them evaluated.
Type :help for more information.

给我一​​些价值

scala> var n = Map.empty[Int, String]
n: scala.collection.immutable.Map[Int,String] = Map()

尝试添加到地图中而没有明确的括号:

scala> n + 1 -> ""
<console>:30: error: type mismatch;
 found   : Int(1)
 required: (Int, ?)
              n + 1 -> ""
                  ^

按照我的预期失败。但是通过重新分配来做同样的事情不会:

scala> n += 1 -> ""

scala> n
res12: scala.collection.immutable.Map[Int,String] = Map(1 -> "")

发生了什么事?为什么这不会失败? scalac是否自己添加了parens?

2 个答案:

答案 0 :(得分:11)

这只是一个优先问题。 +-具有相同的优先级。 =较低。因此,Scala在前一种情况下看到(n + 1) -> "",在后者看到n += (1 -> "")(然后根据赋值运算符的正常规则将其转换为n = (n + (1 -> ""))

答案 1 :(得分:4)

根据scala reference(6.12.4):

  

特别对待分配运算符,因为如果没有其他解释有效,它们可以扩展为分配。 ...   如果满足以下两个条件,则重新解释   1.左侧l没有名为+ =的成员,也不能通过隐式转换(§6.26)转换为名为&gt;的成员的值。 + =。
  2.作业l = l + r的类型更正。特别地,这意味着l指的是可以分配给的变量或对象,并且可以转换为具有名为+的成员的值。

(1)Immutable地图没有名为+=的成员(mutable有)和AFAIK,对分配的内容没有隐式转换肯定输入正确(2):n定义为 var iable 并且成员+