jueves, 21 de diciembre de 2017

Un resumen de Scala for the Impatient, parte 35

Operadores de asignación.

Los operadores de asignación tienen la forma operador= y se utilizan de la siguiente forma:

a operator= b

que es igual a decir :

a = a operator b

Por ejemplo a+= b es equivalente a escribir a = a + b

Hay unos detalles técnicos :
<=, >= y != no son operadores de asignación
Un operador que comienza con = nunca es un operador de asignación (==, ===, =/=, etc)
Si a tiene un operador llamado operator= entonces este sera llamado directamente.

Precedencia.

Cuando tenemos más de un operador, sin paréntesis debemos definir las precedencias de los operadores. Dado que esto define el orden de resolución, por ejemplo :

1 + 2 * 3

El operador * se evalúa primero y luego la suma, esto fue definido por conversión. Lenguajes como C++ y Java tienen un numero fijo de operadores por lo tanto es más sencillo definir la precedencias (se pueden enumerar). En cambio en Scala tenemos un numero arbitrario de operadores por lo que se debe definir esto de forma general.

Excepto para los operadores de asignación, la precedencia está determinada por el primer carácter del operador.

Precedencia más alta: un carácter de operador que no sea los de abajo
* / %
+ -
:
< >
! =
&
^
|

Un carácter que no es un carácter de operador
Prioridad más baja: operadores de asignación

Los caracteres en la misma fila producen operadores con la misma precedencia. Por ejemplo, + y -> tienen la misma precedencia.

Los operadores de Postfijos tienen una precedencia menor que los operadores de infijo:

a infixOp b postfixOp es igual a escribir : (a infixOp b)postfixOp


Asociatividad

Cuando hay un conjunto de operadores con la misma precedencia entra en juego la asociatividad, es decir si resuelve de derecha a izquierda o izquierda a derecha. En scala todos los operadores son asociativos por la izquierda excepto:

  • Los operadores que terminan en :
  • Los operadores de asignación


Por ejemplo el operador :: construye una lista por medio de asociatividad por la derecha:

1 :: 2 :: 3 :: Nil

esto significa

1 :: (2 :: (3 :: Nil))

Esto es así porque necesita construir primero la lista 3 :: Nil para que este parámetro sea usado por le expresión 2 :: (3 :: Nil)

La expresión 3 :: Dicha expresión es igual a la expresión Nil.::(3)