2016-06-26 44 views
3

我正在閱讀M.Odersky編寫的Scala中的程序,現在我正試圖理解運算符的含義。據我所知,Scala中的任何運算符都只是一種方法。考慮下面的例子:+ = Scala中的運算符

class OperatorTest(var a : Int) { 

    def +(ot: OperatorTest): OperatorTest = { 
    val retVal = OperatorTest(0); 
    retVal.a = a + ot.a; 
    println("=") 
    return retVal; 
    } 
} 

object OperatorTest { 
    def apply(a: Int) = new OperatorTest(a); 
} 

我這種情況下,我們只在這個類中定義了+運算符。如果我們輸入的東西是這樣的:

var ot = OperatorTest(10); 
var ot2 = OperatorTest(20); 
ot += ot2; 
println(ot.a); 

然後

=+ 
30 

將輸出。因此,我假設對於Scala中的每個類(或類型?),我們都有+=運算符爲其定義,如a += b iff a = a + b。但是由於每個運算符都只是一個方法,其中定義了+ =運算符?也許有一些類(例如Java中的Object)包含這些運營商等的所有防禦措施。我看着AnyRef希望找到,但不能。

回答

7

+=和類似的操作符在定義了+的情況下被編譯器清除,並且沒有定義+=。 (同樣適用於其他運營商了。)檢查Scala語言規範(6.12.4):

賦值運算符在經過特殊處理的,他們可以 擴展到分配,如果沒有其他的解釋是有效的。

讓我們考慮一個賦值運算符,例如+ =在中綴操作中,其中l,r是表達式。該操作可以被重新解釋爲對應於分配的操作

l = l + r,除了該操作的左手側l僅被評估爲 一次。

如果滿足以下兩個條件 ,則會發生重新解釋。

左側的l沒有名爲+ =的成員,也不能將 通過隱式轉換轉換爲名爲 + =的成員的值。賦值l = l + r是類型正確的。特別是,這意味着l指的是一個變量或對象,它可以被分配到 ,並且可以使用名爲+的成員轉換爲值。

相關問題