簡體   English   中英

是什么使scala.collection.mutable.Map.apply可以成為分配的LHS?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM