Elixir facilita las prácticas del principio de abierto-cerrado al permitir que las funciones tengan múltiples cláusulas; así, en lugar de recurrir a una lógica de control extensa y escrita a mano, se pueden escribir funciones específicas que agreguen o quiten comportamiento con facilidad.
Elixir ofrece múltiples cláusulas de función y guardas que te permiten 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 evalúa, de arriba hacia abajo del archivo fuente, qué cláusula de función invocar.
Las variables que no se usan deben ir precedidas por un guion bajo.
Las guardas se usan para evitar que Elixir invoque funciones a partir de la evaluación de los argumentos que hacen las 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.Puedes encontrar una lista de guardas comunes en la documentación de Elixir. Incluye verificaciones de tipos, aritmética básica, comparaciones y operadores estrictamente booleanos.
Las funciones pueden declarar valores por defecto para uno o más argumentos. Consideremos esta función:
def number(n \\ 13), do: "That's not my favorite"
Al compilar, 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 valor por defecto, esos valores se aplican a la función de izquierda a derecha para completar los argumentos que faltan.
Si la función tiene más de una cláusula, los argumentos por defecto deben definirse en un encabezado 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 muy sencillo en el que un amigo puede adivinar un número secreto. Quieres dar algo de retroalimentación, pero sin revelar la respuesta con un intento. Necesitas diseñar una función que dé respuestas distintas según 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" |
Todos los intentos y los números secretos son números enteros.
Implementa la función compare/2, que recibe dos argumentos, secret_number y guess, los cuales son ambos números enteros.
GuessingGame.compare(5, 5)
# => "Correct"
Modifica la función compare para que responda a los intentos que son mayores que el número secreto.
GuessingGame.compare(5, 8)
# => "Too high"
Modifica la función compare para que responda a los intentos que son 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 hay 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.