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
Respuesta
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.
@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. –
@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
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 ... –
No existe tal posibilidad y es poco probable que se agregue en un futuro previsible.
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".
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
No todos los lenguajes de programación tienen precedencia de operador no modificable. Mire los comandos infix/infixr/infixl de haskell. – Jeriho
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.
- 1. Prioridad del operador para And/&& en Ruby
- 2. Prioridad del operador en boost :: spirit?
- 3. Scala: método \ sobrecarga del operador
- 4. Prioridad y asociatividad del operador en un analizador (Haskell)
- 5. Prioridad del operador (bit a bit 'y' menor que '==')
- 6. ¿Cómo cambiar el código usando los Combinadores Scala Parser para tener en cuenta la prioridad del operador?
- 7. <: <operador en scala
- 8. Ejemplos de uso creativo y útil del operador en Scala
- 9. Operador '::' de Scala, ¿cómo funciona?
- 10. ¿Deben los idiomas de consulta tener prioridad de operador O más que la prioridad de AND?
- 11. Scala - Precedencia del método
- 12. ¿Qué significa el operador `#` en Scala?
- 13. El operador de tilde en Scala
- 14. equivalente al operador javascript || en Scala
- 15. ¿Cómo deseleccionar el operador String "+" en Scala?
- 16. Sobrecarga tanto del operador <como del operador> en la misma clase
- 17. Cambiar prioridad del proceso actual en C
- 18. cambiar la prioridad del proceso en android
- 19. ¿Por qué el operador postfix ++ tiene mayor prioridad que el operador prefijo ++?
- 20. Cambiar la precedencia del operador
- 21. es bueno() usado para cambiar la prioridad del hilo o la prioridad del proceso?
- 22. Agregar espacios al operador + en Scala da resultados diferentes?
- 23. ¿Cuál es el operador === (triple-igual) en Scala Koans?
- 24. Prioridad de subproceso del objeto .NET Backgroundworker
- 25. jQuery - establecer la prioridad del controlador Ajax
- 26. operador del conjunto "en" Python
- 27. Sobrecarga del operador en Clojure
- 28. Sobrecarga del operador en .NET
- 29. Sobrecarga del operador en Java
- 30. Uso del: operador en C
Relacionados hilo de la lista de correo: http://scala-programming-language.1934581.n4.nabble.com/More-unicode-alternatives-for-ASCII-operators-td2008146.html – retronym