viernes, 2 de febrero de 2018

Un resumen de Scala for the Impatient, parte 36


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.

  • La precedencia más alta esta dada por un caracter operador que no sea los antesesores. 
  • * / %
  • + -
  • :
  • < >
  • ! =
  • &
  • ^
  • |
  • Un carácter que no es un operador
  • La menor precedencia es el operador de asignación

Los caracteres que estan en similar fila tiene similar precedencia. Por ejemplo + y -

Los operadores infijos tienen menor precedencia, por lo tanto :

a infixOp b postfixOp es similar a (a infixOp b)postfixOp
 
Asociatividad

Luego de definir la precedencia, es importante la asociatividad dado que exiten operadores que son asociativos. Por ejemplo 17 – 2 – 9 es similar a (17 – 2) – 9. El operador – es asociativo por la izquierda.

En scala todos los operadores son asociativos por la izquierda excepto :

  • Los operadores que finalizan en : 
  • Los operadores de asignación. 

Por ejemplo el operador :: construye listas con asosciatividad a la derecha por ejemplo :

1 :: 2 :: Nil esto es similar a 1 :: (2 :: Nil)

Esto generara una lista con elemento 1 y 2 es ese orden. Es decir el operador :: es un metodo de la lista que ingresa un elemento por la izquierda, convirtiendolo en el primer elemento.

Es decir 2 :: Nil es igual a Nil.::(2)