![](/img/trans.png)
[英]What is the syntax for adding an element to a scala.collection.mutable.Map?
[英]What makes it so that scala.collection.mutable.Map.apply can be a LHS of an assign?
我不明白為什么允許這樣做:
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。 它在編譯器中是否是特殊情況,還是有某些特性或類可以授予此功能?
這是編譯器處理的特殊情況。 它是語法糖。
語言規范涵蓋了所有這些內容,盡管在該文檔中查找內容可能相當困難。
x(i) = e
表示x.update(i, e)
從第6.15節(“評估”)開始:
帶有
=
運算符左側的函數應用程序的賦值f(args) = e
被解釋為f.update(args, e)
,即調用由f
定義的update
函數。這是一些賦值表達式及其等效擴展。
xf = e x.f_=(e) xf() = e xfupdate(e) xf(i) = e xfupdate(i, e) xf(i, j) = e xfupdate(i, je)
因此mutableMap("foo") = 1
擴展為mutableMap.update("foo", 1)
。
l += r
表示l = l + r
第6.12.4節介紹了+=
工作原理。 表達式l += r
被重新解釋為l = l + r
(除非l
具有+=
方法,在這種情況下,它是l.+=(r)
的典型后綴符號)。
應用這兩個規則,我們得到以下擴展序列:
mutableMap("foo") += 10
mutableMap("foo") = mutableMap("foo") + 10
mutableMap.update("foo", mutableMap("foo") + 10)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.