2010-10-12 23 views
16

ya que los operadores normales como +, ::, -> etc. son todos métodos que pueden estar sobrecargados y me pregunto si || y & & son también métodos. Esto podría funcionar teóricamente si se tratara de métodos del objeto booleano. Pero si lo son, ¿por qué es algo así como&& y || en Scala

if (foo == bar && buz == fol) 

posible? Si el compilador lee de derecha a izquierda esto invocaría & & en la barra en lugar de (foo == bar)

+0

'==' obviamente tiene una precedencia mayor que '&&'. –

+0

¿cómo se define la precedencia? es esto solo en el compilador o existen reglas sobre qué operadores se invocan primero – mice

+0

El compilador determina eso. –

Respuesta

28

6.12.3 Operaciones infijos un operador infijo puede ser un identificador arbitraria. operadores infijos tienen precedencia y asociatividad definen de la siguiente manera:

La precedencia de un operador infijo se determina por el primer carácter del operador . Los caracteres se enumeran a continuación en orden ascendente de precedencia, con caracteres en la misma línea que tiene la misma precedencia.

  • (todas las letras)
  • |
  • ^
  • &
  • <>
  • =!
  • :
  • + -
  • * /%
  • (todos los otros caracteres especiales)

Es decir, los operadores que comienzan con una letra tienen menor precedencia, seguido por los operadores a partir con '|', etc.

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 (=). Que es, es menor que la precedencia de cualquier otro operador.

Sigue con una explicación de la asociatividad, y cómo se combina todo en una expresión con múltiples operadores. El Scala Reference hace una buena lectura.

0

Estos dos son definitivamente métodos en Scala.