2010-05-27 21 views
39

Me gusta la propuesta de Scala de operador, pero en algunos casos raros, las reglas no modificadas pueden ser inconvenientes, porque tiene restricciones para nombrar sus métodos. ¿Hay formas de definir otras reglas para una clase/archivo, etc. en Scala? Si no, ¿se resolvería en el futuro?Prioridad del operador en Scala

+3

Relacionados hilo de la lista de correo: http://scala-programming-language.1934581.n4.nabble.com/More-unicode-alternatives-for-ASCII-operators-td2008146.html – retronym

Respuesta

91

La precedencia del operador se fija en el Scala Reference - 6.12.3 Infix Operations por el primer carácter en el operador. Enumerados en orden de prioridad creciente:

(all letters) 
| 
^ 
& 
= ! 
< > 
: 
+ - 
*/% 
(all other special characters) 

Y no es muy probable que cambie. Probablemente creará más problemas de los que corrige. Si se usa la precedencia normal del operador, cambiarla por una clase será bastante confuso.

+5

@huynhjl de la referencia citada: " Hay una excepción a esta regla, que se refiere a los operadores de asignación (§6.12.4). La precedencia de un operador de asignación es la misma que la de asignación simple (=). Es decir, es menor que la precedencia de cualquier otro operador " §6.12.4 describe un operador de asignación como uno que termina en "=". Entonces, la lista anterior está incompleta, en lugar de incorrecta. –

+6

@Luigi Plinge, '===' no es un operador de asignación porque existe una excepción: un operador que termina en '=' es un operador de asignación * a menos que el operador también comience con un carácter igual *. Mira el hilo de Gmane y el otro enlace, el propio Martin indicó que el SLS necesitaba una actualización. No puedo ver una actualización todavía – huynhjl

+1

Creo que la decisión de hacer '(todas las letras)' la "más débil" es rara: 'a contiene b || c contiene d', que creo que es una construcción frecuente, necesita paréntesis ... –

7

No existe tal posibilidad y es poco probable que se agregue en un futuro previsible.

0

reglas modificadas pueden ser un inconveniente, ya que hay restricciones en el nombramiento de sus métodos

  • no tiene ninguna restricción en nombrar sus métodos. Por ejemplo, puede definir los métodos +, -, * y etc. para una clase.
  • también debemos seguir de facto las "reglas no modificadas" (impuestas por las reglas de precedencia del operador Scala) mencionadas en la respuesta anterior (https://stackoverflow.com/a/2922456) por Thomas Jung: es común para muchos lenguajes de programación, si no todos, y álgebra abstracta; no necesitamos redefinir la precedencia del operador para a + b * c.

Consulte el Capítulo 6 del libro http://www.scala-lang.org/docu/files/ScalaByExample.pdf para el ejemplo de la clase "Racional".

+0

por "restricciones al nombrar sus métodos" Quiero decir que si, por ejemplo, cree que '+' es un nombre perfecto para su método, puede haber situaciones en las que se verá obligado a elegir otro nombre debido a su precedencia no modificable. – Jeriho

+1

No todos los lenguajes de programación tienen precedencia de operador no modificable. Mire los comandos infix/infixr/infixl de haskell. – Jeriho

1

Hubo un feature request planteado en el typelevel fork of the scala compiler, una versión del compilador que 'previsualiza' las características experimentales. Los desarrolladores sugirieron que si alguien escribiera un SIP para esto, se podría considerar su implementación.

Pero en su estado actual, no hay manera de anular la precedencia. Sus reglas se definen formalmente en el language specification.

Cuestiones relacionadas