2011-08-11 16 views
7

En Java, < tiene una prioridad más alta que ==. En Scala es viceversa. Me pregunto por qué la gente de Scala eligió ese camino. Otras precedencias de operador binario se alinean con Java (excepto operaciones en modo bit, pero es comprensible por qué no dieron precedencias especiales para ellas).¿Por qué Scala cambió la precedencia relativa de los operadores relacionales vs igualdad (en comparación con Java)?

ACTUALIZACIÓN: En realidad fue un error en la especificación del idioma, '<' tiene una prioridad mayor que '==' en Scala.

Respuesta

14

No se invierte en Scala. Prueba esto:

val what = 5 == 8 < 4 

recibo una advertencia de tiempo de compilación: comparing values of types Boolean and Int using `==' will always yield false; obviamente, el compilador lo tradujo a 5 == (8 < 4), como en Java.

Puede probar esto, también:

class Foo { 
    def ===(o: Foo) = { println("==="); this } 
    def <<<(o: Foo) = { println("<<<"); this } 
    def >>>(o: Foo) = { println(">>>"); this } 
} 

def foo = new Foo 

Entonces llamando foo === foo <<<foo>>> foo impresiones de esto:

<<< 
>>> 
=== 

Lo que significa que se analiza como (foo === ((foo <<< foo) >>> foo))

¿Puede dar un ejemplo donde la precedencia ¿está alreves?

+1

Lo leí de la referencia del lenguaje Scala, sección 6.12.3 – Aivar

+1

¿Entonces tal vez es un error tipográfico? ... No me atrevería a contradecir la Referencia, pero a partir de estas dos pruebas, los métodos que comienzan con '<' tienen mayor precedencia que los métodos comenzando con '=' cuando se usa en notación infija (en Scala 2.8.1). –

+0

Gracias por el ejemplo extendido, parece que hay un error tipográfico en la referencia. Estaba comparando las precedencias de los operadores en diferentes idiomas, por eso lo noté. – Aivar

Cuestiones relacionadas