Más construcciones propias de Scala.

Tuples

Una tupla representa un conjunto de valores, ya sean del mismo o distinto tipo.

Es particularmente útil cuando se debe retornar más de un valor desde una función.

Para acceder a un valor de una tupla se utiliza el ordinal de su posición precedido por un guión bajo.

Aunque también se puede desestructurar la tupla para acceder por nombre.

Si se necesita indicar el tipo de forma explícita entonces se deben utilizar los tipos Tuple2, Tuple3, … y así sucesivamente hasta Tuple22.

Mixins

Los mixins son estructuras que permiten extender una clase con distintos comportamientos sin necesidad de utilizar herencia múltiple.

Una clase sólo puede extender de una clase padre, pero de tantos mixins como se quiera. La única condición es que la clase padre y los mixins extiendan a su vez de la misma clase.

El uso de mixins favorece la composición frente a la herencia y mejora la intencionalidad del código.

Higher-order Functions

Una función de orden superior es aquella que admite una función como parámetro o retorna una función como resultado.

Un ejemplo de método que admite una función como parámetro es map. Este método aplica una función dada a todos los elementos de una secuencia.

La función pasada como parámetro puede ser una lambda anónima embebida.

E incluso es posible utilizar una notación abreviada de Scala que utiliza el símbolo _ para identificar los parámetros.

De forma general, los métodos que admiten funciones o retornan funciones se definen utilizando la “signatura” de dichas funciones. Es decir, el tipo de los parámetros que admiten y el tipo de su resultado.

Currying

Scala permite que un método tenga múltiple lista de parámetros.

Un ejemplo de este tipo de métodos es foldLeft, que aplica un operador binario op a una secuencia de valores, de izquierda a derecha, empezando por un valor inicial z.

Este método permite por ejemplo sumar todos los números de una secuencia dada.

Y gracias a que el método tiene varias listas de parámetros, se puede utilizar la notación abreviada de Scala utilizando el símbolo _ para representar los parámetros.

Esto puede resultar un poco confuso al principio, pero tiene la ventaja de que permite definir un método a partir de otro prefijando una o más de sus listas de parámetros.

Esta forma de escribir los métodos se asimila con la técnica conocida como currying. Esta técnica transforma métodos que admiten múltiples argumentos en una secuencia de métodos que admiten un único argumento cada una de ellos. Por ejemplo, se puede tomar un método que toma dos valores de tipo X e Y y retorna un valor de tipo Z, y transformarlo en un método que toma un valor de tipo X y retorna una función que convierte un valor de tipo Y en un valor de tipo Z.

Pattern Matching

La técnica de pattern matching permite comprobar si un valor cumple un determinado patrón. Scala ofrece una implementación de esta técnica a través de la palabra reservada match que utiliza una sintaxis similar a la sentencia switch de Java.

El guión bajo se utiliza para casar cualquier valor, es equivalente a default en Java.

Además de valores constantes, Scala permite utilizar tipos como patrones.

Una forma particularmente útil de match permite desestructurar los valores de clases de tipo case.

Los patrones se pueden ampliar utilizando una expresión de guarda para añadir comprobaciones adicionales.

Regular Expressions

Las expresiones regulares en Scala siguen el patrón habitual de otros lenguajes de programación. Están implementadas por la clase Regex y se construyen a partir de cadenas de texto que se convierten en expresiones regulares mediante el método r.

Singleton Objects

Un object en Scala es a la vez la definición de una clase y un objeto singleton de dicha clase.

Este tipo de objetos ya han aparecido anteriormente, pero es necesario reintroducirlos para hablar de los companion objects. Un companion object es un objeto que tiene el mismo nombre que una clase. Extiende la clase homónima añadiendo miembros que son visibles por todas las instancias de dicha clase. Es similar a decir que permite añadir métodos o propiedades estáticas a una clase desde otra clase.

Uno de los usos preferidos de esta técnica es la de crear factorías de objetos.

La única limitación de esta técnica es que la clase y el companion object tienen que estar definidos en el mismo fichero.

Extractor Objects

Sobre un object en Scala se puede definir un método de nombre apply que actúa como factoría, admite parámetros y crea un objeto. De igual forma, se puede definir un método de nombre unapply que realiza el proceso inverso, admite un objeto y retorna los parámetros que se utilizaron para construirlo.