Elixir facilita las prácticas del Open-Closed Principle al permitir que las funciones tengan múltiples cláusulas, de modo que, en lugar de repartir y escribir de forma rígida la lógica de control, se pueden escribir funciones concretas para añadir o quitar comportamiento con facilidad.
Elixir ofrece múltiples cláusulas de función y guardas para escribir:
def number(n) when n == 7 do
"Awesome, that's my favorite"
end
def number(_n) do
"That's not my favorite"
end
En tiempo de ejecución, Elixir comprobará, de arriba a abajo del archivo fuente, qué cláusula de función invocar.
Las variables que no se usan deben ir precedidas de un guion bajo.
Las guardas se usan para evitar que Elixir invoque funciones basándose en la evaluación de los argumentos mediante funciones de guarda. Las guardas comienzan con la palabra clave when, seguida de una expresión booleana. Las funciones de guarda son funciones especiales que:
true o false estrictos.Puedes encontrar una lista de guardas habituales en la documentación de Elixir. Incluye comprobaciones de tipo, aritmética básica, comparaciones y operadores estrictamente booleanos.
Las funciones pueden declarar valores predeterminados para uno o varios argumentos. Veamos esta función:
def number(n \\ 13), do: "That's not my favorite"
Al compilarse, Elixir crea una definición de función para number/0 (sin argumentos) y number/1 (un argumento).
Si más de un argumento tiene valores predeterminados, los valores predeterminados se aplicarán a la función de izquierda a derecha para rellenar los argumentos que falten.
Si la función tiene más de una cláusula, los argumentos predeterminados deben definirse en una cabecera de función (una función sin cuerpo) antes de las cláusulas de la función:
def number(n \\ 13)
def number(n) when n < 10, do: "Dream bigger!"
def number(n) when n > 100, do: "Not that big..."
Estás creando un juego en línea sencillo en el que un amigo puede adivinar un número secreto. Quieres dar algún comentario, pero sin desvelar la respuesta con un intento. Necesitas idear una función que proporcione respuestas diferentes en función de cómo se relacione el intento con el número secreto.
| Condición | Respuesta |
|---|---|
| Cuando el intento coincide con el número secreto | "Correct" |
| Cuando el intento es uno más o uno menos que el número secreto | "So close" |
| Cuando el intento es mayor que el número secreto | "Too high" |
| Cuando el intento es menor que el número secreto | "Too low" |
| Cuando no se hace ningún intento | "Make a guess" |
Tanto los intentos como los números secretos son números enteros.
Implementa la función compare/2, que recibe dos argumentos, secret_number y guess, ambos números enteros.
GuessingGame.compare(5, 5)
# => "Correct"
Modifica la función compare para que responda a los intentos que sean mayores que el número secreto.
GuessingGame.compare(5, 8)
# => "Too high"
Modifica la función compare para que responda a los intentos que sean menores que el número secreto.
GuessingGame.compare(5, 2)
# => "Too low"
Modifica la función compare para que responda a los intentos que estén cerca del número secreto.
GuessingGame.compare(5, 6)
# => "So close"
GuessingGame.compare(5, 4)
# => "So close"
Modifica la función compare para que responda cuando no haya ningún intento.
GuessingGame.compare(5)
# => "Make a guess"
GuessingGame.compare(5, :no_guess)
# => "Make a guess"
Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.