2012-01-17 109 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並擁有會員+