lunes, 19 de diciembre de 2016

Un resumen de Scala for the Impatient, parte 2

Sobrecarga de operadores. 


La sobrecarga de operadores en scala es más simple, dado que un operador no es más que un método de un objeto. Es decir:

a + b

Es la forma simplificada de :

a.+(b)

Scala no tiene problema en que un método pueda llamase con símbolos tales como +, *, -, %, etc.

Por lo general podemos escribir

objeto método objeto

igual a smalltalk o

objeto.metodo(objeto)

igual a java o c

Otra diferencia importante es que no tenemos los operadores ++ o -- de java o c. Solo tenemos += o
-=

counter+=1

Otra diferencia es que podemos usar operadores para objetos BigInt o BigDecimal:

val x: BigInt = 1234567890
x * x * x // Yields 1881676371789154860897069000

Llamando funciones y métodos

Scala tiene funciones además de métodos. Es más sencillo utilizar funciones matemáticas como min o pow en Scala que en Java; no es necesario llamar a métodos estáticos de una clase.

sqrt(2) // Yields 1.4142135623730951
pow(2, 4) // Yields 16.0
min(3, Pi) // Yields 3.0

Las funciones matemáticas están definidas en el paquete Math que se puede importar:

import scala.math._

Scala no tiene métodos estáticos, pero tiene el concepto de objetos singletones, que son eso objetos que nacen con una sola instancia.

Los métodos que no necesitan parámetros, no necesitan los paréntesis que cierran y abren "()" por ejemplo:

"Hello".distinct

Aplicar un método. 

En Scala, es común usar una sintaxis que se parece a una llamada de función. Por ejemplo si a un string lo llamamos con un parámetro entero este retornara el char en  posición, similar a llamar a charAt de java o el operador [] en C. Por ejemplo:

"Hello"(4) // Yields 'o'

Esto funciona porque StringOps implemento el método apply :

def apply(n: Int): Char

Este método no es necesario llamarse, es decir se llama de forma implícita, pero podemos llamarlo y funciona:

"Hello".apply(4)

Usar método apply para construir objetos es común es scala, por ejemplo el array:

Array(1, 4, 9, 16) // retorna un array

Seguimos en la parte 3.