2012-06-11 7 views
5

ScalaはShort型とByte型に対して "+ ="演算子を定義するのはなぜですか?次Scalaのコードが与えられ

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

は、私は基本的なタイピングを問うていない - それは「ショート+値== INT」ことは明らかです。

私の質問は次のとおりです。
1.オペレータが使用できる方法はありますか?
2.そうでない場合、なぜオペレータは短い&バイトで使用できるのですか?

[ひいては* =、| = & =など]

+0

実際、Shortには "+ ="または "* ="というメソッドがありません。短いhttp://www.scala-lang.org/api/current/index.html#scalaのドキュメントを見ることができます。短くx someoperator = yはコンパイラによって自動的にx = x someoperator yに変換されます。 – Eastsun

+0

@Eastunしかし、どちらもInt :-) 'a op = b'は拡張形式の文法的砂糖です:' a = a op b'は型エラー(Short + Short - > Int)を説明しています。それはなぜ決定がなされたのか、あるいはこの構成を使用するかどうかを説明するものではありません。 (C#では、 'byte + = 1'を行うのは完全に合法ですが、' byte = byte + 1'はできません。そして、その振る舞いは標準的なものです - C#のLHS型への暗黙のキャストがあります。 –

+0

@pstはい、C#のようにJavaで同じことをすることができます(正しく覚えていれば) – Eastsun

答えて

1

問題は、 "+(ショート)" Shortクラスには次のように定義されていることのようだ:だから

def +(x: Short): Int 

常にIntを返します。

を考えると、あなたが+操作は(明らかに)脱糖のバージョンでは「短い」VARに割り当てることができないのIntに評価されるため+ =「演算子」を使用することができないで終わるこの:

x K= y 

そしてXはvarがあり、Kは任意のシンボリック演算子であり、場合xのKの方法がある:Scalaのコンパイラは次のように表現を見つけたときので、あなたの2番目の質問については

short = short + short 

は、それが「利用可能」でありますコンパイラはそれを "desugar"に変換します:

x = x K y 

その後、コンパイルを続行します。

関連する問題