是什么让scala.collection.mutable.Map.apply可以成为赋值的LHS?

时间:2014-07-03 20:50:16

标签: scala

我不明白为什么允许这样做:

scala> val mutableMap = new scala.collection.mutable.HashMap[String,Int]()
mutableMap: scala.collection.mutable.HashMap[String,Int] = Map()

scala> mutableMap("foo") = 1

scala> mutableMap("foo")
res1: Int = 1

scala> mutableMap("foo") += 10

scala> mutableMap("foo")
res3: Int = 11

我认为后者(+=)是前者(=)的扩展 - 但我不明白是什么使得这在分配中成为有效的LHS。它是否在编译器中是特殊的,还是有一些特性或类授予此功能?

1 个答案:

答案 0 :(得分:8)

这是编译器处理的特例。这是语法糖。

The language spec涵盖了所有这些内容,但在该文档中找到内容可能相当困难。


x(i) = e表示x.update(i, e)

从第6.15节(“Assigments”):

  

f(args) = e运算符左侧带有函数应用程序的赋值=被解释为f.update(args, e),即调用由{{1}定义的update函数}}

     

以下是一些赋值表达式及其等效扩展。

f

因此x.f = e x.f_=(e) x.f() = e x.f.update(e) x.f(i) = e x.f.update(i, e) x.f(i, j) = e x.f.update(i, j e) 扩展为mutableMap("foo") = 1


mutableMap.update("foo", 1)表示l += r

第6.12.4节描述了l = l + r的工作原理。表达式+=被重新解释为l += r(除非l = l + r具有l方法,在这种情况下,它是+=的典型中缀表示法。


应用这两个规则,我们得到了这个扩展序列:

  • l.+=(r)
  • mutableMap("foo") += 10
  • mutableMap("foo") = mutableMap("foo") + 10