2012-06-11 16 views
5

Biorąc pod uwagę następujący kod scala:Dlaczego Scala definiuje operator "+ =" dla typów krótkich i bajtowych?

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

Nie kwestionując samej pisanie - to jasne, że "Short wartość + == Int".

Moje pytania są następujące:
1. Czy istnieje jakiś sposób na wykorzystanie operatora?
2. Jeśli nie, to dlaczego operator jest dostępny do użycia w skrócie & Bajt?

[A o rozszerzeniu * =, | = & = itd]

+0

W rzeczywistości Short nie ma metody "+ =" lub "* =", możesz przejrzeć dokument dla skrótu http://www.scala-lang.org/api/current/index.html#scala. Krótki . x someoperator = y automatycznie tłumaczy na x = x someoperator y przez kompilator. – Eastsun

+0

@Eastsun Ale też Int :-) 'a op = b' to cukier syntaktyczny dla rozwiniętej formy:' a = a b b', co wyjaśnia błąd typu (Short + Short -> Int). Nie wyjaśnia, dlaczego podjęto decyzję lub jaki użytek z tego konstruktu może mieć - lub czego nie może. (W języku C# jest całkowicie legalne wykonywanie 'bajtu + = 1', ale nie' bajt = bajt + 1', a zachowanie jest specyficzne w standardzie - istnieje niejawna rzutowanie z powrotem na typ LHS w języku C#). –

+0

@pst Tak, możesz zrobić to samo w Javie, jak w C# (Jeśli dobrze pamiętam.) – Eastsun

Odpowiedz

1

Problem wydaje się, że "+ (Short)" na Short klasa jest zdefiniowana jako:

def +(x: Short): Int 

Tak zawsze zwraca wartość Int.

Biorąc pod uwagę to, że w końcu nie jest w stanie korzystać z „operator” + =, ponieważ operacja + ocenia do Int który (oczywiście) nie może być przypisany do „short” var w odcukrzona wersji:

short = short + short 

jeśli chodzi o drugie pytanie, to jest „dostępny”, ponieważ gdy kompilator Scala znajdzie wyrażeń takich jak:

x K= y 

a jeśli x jest zmienna i K jest każdy podmiot symboliczny i jest metoda K wx następnie kompilator tłumaczy lub "odsyła" go do:

x = x K y 

Następnie próbuje kontynuować kompilację.

Powiązane problemy