2012-06-11 9 views
5

Dado el siguiente código Scala:¿Por qué Scala define un operador "+ =" para los tipos Corto y Byte?

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

no cuestionar la tipificación subyacente - es claro que "a corto valor == + Int".

Mis preguntas son:
1. ¿Hay alguna manera de que el operador pueda ser utilizado?
2. Si no es así, ¿por qué el operador está disponible para su uso en Short & Byte?

[Y por extensión * =, | = = &, etc.]

+0

En realidad, Short no tiene el método "+ =" o "* =", puede consultar el documento corto http://www.scala-lang.org/api/current/index.html#scala. Corto . x someoperator = y están traduciendo a x = x someoperator y por el compilador automáticamente. – Eastsun

+0

@Eastsun Pero tampoco lo hace Int :-) 'a op = b' es azúcar sintáctica para la forma expandida:' a = a op b', que explica el tipo de error (Corto + Corto -> Int). No explica por qué se tomó la decisión o qué uso podría tener este poder, o no. (En C# es perfectamente legal hacer 'byte + = 1' pero no' byte = byte + 1', y el comportamiento es específico en el estándar - hay un lanzamiento implícito al tipo LHS en C#). –

+0

@pst Sí, puedes hacer lo mismo en Java que en C# (Si mal no recuerdo) – Eastsun

Respuesta

1

El problema parece ser que "+ (corto)" en la clase corto se define como:

def +(x: Short): Int 

Así siempre devuelve un Int.

Dada esta al final no ser capaz de utilizar el "operador" + = porque la operación + evalúa a un Int, que (obviamente) no puede ser asignado a la var "corto" en la versión Desazucarado:

short = short + short 

en cuanto a su segunda pregunta, que está "disponible" porque cuando el compilador Scala encuentra expresiones como:

x K= y 

y si x es un var y K es cualquier operador simbólico y hay un método K en x entonces el compilador lo traduce o "desugar" a:

x = x K y 

Y luego intenta continuar la compilación con eso.

Cuestiones relacionadas