我不明白为什么允许这样做:
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。它是否在编译器中是特殊的,还是有一些特性或类授予此功能?
答案 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