Vamos a ampliar nuestra calculadora en Elixir para manejar operaciones básicas como suma, resta, multiplicación y división. Al implementar la división, nos encontramos con un problema clásico: la división por cero. Si intentamos dividir un número entre cero, Elixir nos lanza un error aritmético, lo que nos obliga a buscar una forma de manejar esta situación sin que el programa falle.
Una solución sencilla sería usar un condicional dentro de la función para detectar si el divisor es cero y devolver un valor especial, como un átomo :infinito. Por ejemplo, podríamos escribir algo así:
def dividir(a, b) do
if b == 0 do
:infinito
else
a / b
end
end
Esto funciona, pero Elixir nos ofrece una forma más elegante y potente para manejar casos como este: las guardas. Las guardas nos permiten definir múltiples funciones con el mismo nombre y aridad, pero con condiciones que determinan cuál se ejecuta según los argumentos que reciba.
Podemos definir dos funciones dividir/2: una que se active cuando el divisor sea cero y otra para el resto de casos. La clave está en usar la palabra clave when para establecer la condición de la guarda. Por ejemplo:
def dividir(a, 0) do
:infinito
end
def dividir(a, b) when b != 0 do
a / b
end
Aquí, la primera función se ejecuta solo cuando el segundo argumento es cero, devolviendo el átomo :infinito. La segunda función se activa cuando el divisor no es cero y realiza la división normalmente.
Es importante entender que Elixir evalúa las funciones de arriba hacia abajo, buscando la primera definición que coincida con el nombre, la aridad y cuya guarda se cumpla. Si la guarda no se cumple, Elixir pasa a la siguiente definición. Por eso, el orden en que declaramos estas funciones es crucial. Si colocamos primero la función sin guarda, esta se ejecutará siempre y la función con guarda nunca se usará.
Además, las guardas nos permiten mantener nuestro código modular y claro, evitando funciones largas con múltiples condicionales internas. Podemos crear pequeñas funciones especializadas y usar guardas para controlar cuándo se deben ejecutar.
En resumen, las guardas son condiciones booleanas que se colocan fuera de la definición de la función, justo después de la firma, usando when. Permiten que Elixir seleccione la función adecuada según los argumentos, facilitando el manejo de casos especiales como la división por cero en nuestra calculadora.
A medida que avancemos, veremos más tipos de guardas y cómo aprovecharlas para escribir código más limpio y expresivo en Elixir. Por ahora, este enfoque nos ayuda a evitar errores comunes y a mantener nuestras funciones compactas y fáciles de entender.