En Gleam, una expresión case se puede usar para ejecutar código de forma condicional. Con una expresión case, un valor se puede probar contra uno o más patrones. Un ejemplo de esos patrones es el patrón literal, que compara un valor con un valor literal (por ejemplo, 1 o "hello").
Las expresiones case se escriben con la palabra clave case:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
1 -> "One"
}
}
Aunque esto pueda parecer una sentencia switch de otros lenguajes, la coincidencia de patrones empieza a brillar cuando también se usan otros patrones. Uno de ellos es el patrón de variable, que permite asignar un valor a una variable. En este ejemplo, a la variable i se le asignará el valor de number si este no es 0:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i -> "Non zero"
}
}
En algunos casos, quizás quieras agregar una condición adicional a un patrón. Esto se conoce como guarda (cláusula) y se puede agregar con la palabra clave if:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i if i < 0 -> "Negative number"
}
}
Por razones de rendimiento, en las guardas solo se permiten operadores matemáticos y booleanos básicos; no se pueden usar otras funciones en las guardas.
En el ejemplo anterior, no todos los argumentos posibles tendrán un patrón que coincida. El compilador lo detectará y mostrará un error. Esto se conoce como comprobación exhaustiva. Para resolver la advertencia, hay que manejar todos los casos. Para eso se puede usar el patrón de descarte, que es un patrón que coincide con cualquier valor:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i if i < 0 -> "Negative number"
_ -> "Positive number"
}
}
// No compiler error
Se pueden comparar varios patrones en una misma cláusula usando | para separar cada patrón. Solo se puede agregar una guarda por cláusula:
pub fn describe(number: Int) -> String {
let yell = True
case number {
0 -> "Zero"
3 | 5 -> "One of the first odd prime numbers"
2 | 4 | 6 | 8 if !yell -> "One of the even numbers less than 10"
i if i % 2 == 0 && yell -> "[Yelling] I'm telling you! It's a even nunber"
i if i < 0 -> "Negative number"
_ -> "Positive number"
}
}
// No compiler error
Las expresiones case prueban un valor contra cada patrón de arriba hacia abajo, hasta encontrar un patrón que coincida y ejecutar la lógica asociada a ese patrón. ¡El orden de los patrones importa!
En este ejercicio vas a jugar con alguien a adivinar un número. Las reglas son simples: eliges en secreto un número entre 1 y 100 y esa persona intenta adivinar qué número elegiste. Para ayudarla, respondes de forma distinta según qué tan cerca esté su intento del número que elegiste (42). Estas son las reglas para las distintas respuestas:
42: "Correct"41 o 43: "So close"41: "Too low"43: "Too high"Tienes cuatro tareas para implementar las respuestas a los intentos.
Implementa la función reply para responder a un intento correcto:
reply(42)
// -> "Correct"
Modifica la función reply para responder a intentos cercanos:
reply(41)
// -> "So close"
Modifica la función reply para responder a intentos demasiado bajos:
reply(25)
// -> "Too low"
Modifica la función reply para responder a intentos demasiado altos:
reply(88)
// -> "Too high"
Regístrate en Exercism para aprender y dominar Gleam con 33 conceptos122 ejercicios y mentoría humana real, todo gratis.