Cuando trabajamos con Scala, uno de los aspectos fundamentales que debemos dominar es la definición y uso de funciones. En un lenguaje funcional como Scala, las funciones no son simplemente bloques de código que ejecutan instrucciones, sino expresiones que reciben parámetros y devuelven resultados. La clave está en diseñar funciones pequeñas y claras que, para las mismas entradas, siempre produzcan las mismas salidas, garantizando así un comportamiento predecible y seguro.
Para definir una función en Scala, utilizamos la palabra clave def, seguida del nombre que queramos darle a la función. Por ejemplo, si queremos crear una función que sume dos números, podemos llamarla suma. Los parámetros se declaran entre paréntesis, indicando primero el nombre de cada parámetro, seguido de dos puntos y el tipo de dato que aceptan. En Scala, a diferencia de otros lenguajes, el tipo es obligatorio en los parámetros de entrada para que el compilador pueda validar correctamente el uso de la función.
Veamos cómo sería la definición de una función suma que recibe dos enteros y devuelve su suma:
def suma(a: Int, b: Int): Int = a + b
Aquí, después de los parámetros, indicamos con dos puntos que la función devuelve un Int. Aunque Scala puede inferir el tipo de retorno automáticamente, es recomendable especificarlo explícitamente en funciones públicas para facilitar la documentación y el uso por parte de otros desarrolladores, especialmente cuando se trabaja con APIs.
Una característica interesante de Scala es que las funciones pueden definirse como expresiones en una sola línea, lo que las hace muy concisas y legibles. En el ejemplo anterior, la expresión a + b es el valor que la función devuelve.
Pero, ¿qué ocurre si necesitamos que la función realice varias operaciones antes de devolver un resultado? Scala permite definir funciones con múltiples líneas usando llaves {}. En este caso, no es necesario usar la palabra clave return; simplemente la última expresión dentro del bloque será el valor devuelto por la función.
Por ejemplo, si queremos definir una función dividir que tome dos enteros y devuelva el resultado de la división, podríamos escribirla así:
def dividir(a: Int, b: Int): Int = {
val dividendo = a
val divisor = b
dividendo / divisor
}
En este bloque, declaramos dos valores temporales, dividendo y divisor, y la última línea es la expresión que se devuelve. Si intentamos dividir por cero, Scala lanzará una excepción de aritmética, igual que en Java.
Este enfoque de funciones pequeñas, claras y expresivas es fundamental en la programación funcional y nos ayuda a escribir código más mantenible y seguro. Además, al evitar el uso explícito de return, el código se vuelve más limpio y fácil de entender.
Así, con estas bases, podemos empezar a construir funciones en Scala que sean tanto simples como potentes, aprovechando la sintaxis y características que el lenguaje nos ofrece para expresar lógica de manera elegante y funcional.