En Gleam, una expresión case se puede usar para ejecutar código de forma condicional. Con una expresión case se puede comprobar un valor contra uno o varios patrones. Un ejemplo de ese tipo de patrón es el patrón literal, que hace coincidir 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 instrucciones switch de otros lenguajes, la coincidencia de patrones empieza a destacar cuando se usan también otros patrones. Uno de esos patrones 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 no es 0:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i -> "Non zero"
}
}
En algunos casos, es posible que quieras añadir una condición adicional a un patrón. Esto se conoce como guarda (cláusula), y se puede añadir con la palabra clave if:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i if i < 0 -> "Negative number"
}
}
Por motivos 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 todas las entradas 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 cubrir todos los casos. Para ello 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
En una misma cláusula se puede hacer coincidir varios patrones usando | para separarlos. Solo se puede añadir 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 comprueban un valor contra cada patrón de arriba 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 juegas a adivinar un número con un amigo. Las reglas son sencillas: eliges en secreto un número entre 1 y 100 y tu amigo intenta adivinar qué número has elegido. Para ayudarle, respondes de forma distinta según lo cerca que esté la conjetura del número que has elegido (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 programar las respuestas a las conjeturas.
Implementa la función reply para responder a una conjetura correcta:
reply(42)
// -> "Correct"
Modifica la función reply para responder a las conjeturas cercanas:
reply(41)
// -> "So close"
Modifica la función reply para responder a las conjeturas demasiado bajas:
reply(25)
// -> "Too low"
Modifica la función reply para responder a las conjeturas demasiado altas:
reply(88)
// -> "Too high"
Regístrate en Exercism para aprender y dominar Gleam con 33 conceptos122 ejercicios y mentoría humana real, todo gratis.