2012-06-11 61 views
5

考慮下面的Scala代碼:爲什麼Scala爲Short和Byte類型定義了一個「+ =」運算符?

var short: Short = 0 
short += 1  // error: type mismatch 
short += short // error: type mismatch 
short += 1.toByte // error: type mismatch 

我不質疑潛在的打字 - 很明顯,「短+值==詮釋」。

我的問題是:
1.是否有任何方法可以使用操作員?
2.如果沒有,那麼爲什麼操作員可以使用Short & Byte?

[通過擴展* =,| = & =,等]

+0

實際上,Short沒有方法「+ =」或「* =」,您可以查看Short http://www.scala-lang.org/api/current/index.html#scala的文檔。短。 x someoperator = y由編譯器自動轉換爲x = x someoperator y。 – Eastsun

+0

@Eastsun但是Int :-)'a op = b'也不是擴展形式的語法糖:'a = a op b',它解釋了類型錯誤(Short + Short - > Int)。它並沒有解釋爲什麼做出這個決定,或者這個構想可能 - 或者不可能 - 有什麼用處。 (在C#中,執行'byte + = 1'而不是'byte = byte + 1'是完全合法的,並且行爲在標準中是特定的 - 在C#中隱式轉換回LHS類型)。 – 2012-06-11 06:28:15

+0

@pst是的,你可以在Java中做和C#一樣的事情(如果我沒有記錯的話) – Eastsun

回答

1

這個問題似乎是在短類 「+(短)」 被定義爲:

def +(x: Short): Int 

所以它總是返回一個Int。

考慮到這一點,你最終沒有能夠使用+ =「操作員」,因爲+操作結果爲它(顯然)不能在脫糖版本分配到「短」 VAR的詮釋:

short = short + short 

關於你的第二個問題,這是「可用」,因爲當Scala編譯器發現這樣的表達式:

x K= y 

如果x是一個VAR和K是任何象徵性的運營商,有在X K法那麼編譯器會翻譯或「解除」它:

x = x K y 

然後嘗試繼續編譯。

相關問題