2012-01-17 69 views
3

我刚才注意到,虽然我需要添加一对到地图时澄清括号,我没有做一个重新分配的时候需要他们:斯卡拉:奇怪添加到地图

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本身?

回答

11

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

4

根据scala reference(6.12.4):

赋值运算符,它们可扩展到分配,如果没有其他的解释是有效的特殊处理。 ...如果满足以下两个条件,则会发生 重新解释。
1.左侧的l没有名为+ =的成员,也不能通过隐式转换(第6.26节)将其转换为名为> + =的成员的值。
2.作业l = l + r类型正确。特别是,这意味着l指的是一个可以赋值的变量或对象,并且可以使用名为+的成员转换为值。

(1)Immutable地图没有名为+=成员(mutable有)和AFAIK,有没有隐式转换的东西与分配绝对键入正确的(2):N定义为var iable并拥有会员+