我刚刚注意到,虽然我需要在地图中添加一对时澄清一些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?
答案 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 并且成员+
。