No Gleam, uma expressão case pode ser usada para executar código condicionalmente. Com uma expressão case, um valor pode ser testado contra um ou mais padrões. Um exemplo desse tipo de padrão é o padrão literal, que compara um valor com um valor literal (por exemplo, 1 ou "hello").
As expressões case são escritas com a palavra-chave case:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
1 -> "One"
}
}
Embora isso possa parecer com as instruções switch de outras linguagens, a correspondência de padrões começa a brilhar quando você também usa outros padrões. Um deles é o padrão de variável, que permite atribuir um valor a uma variável. Neste exemplo, a variável i receberá o valor de number se ele não for 0:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i -> "Non zero"
}
}
Em alguns casos, você pode querer adicionar uma condição extra a um padrão. Isso é conhecido como uma guarda (cláusula), que pode ser adicionada com a palavra-chave if:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i if i < 0 -> "Negative number"
}
}
Por questões de desempenho, apenas operadores matemáticos e booleanos básicos são permitidos em guardas; outras funções não podem ser usadas nelas.
No exemplo acima, nem toda entrada possível terá um padrão correspondente. O compilador vai detectar isso e emitir um erro. Isso é conhecido como verificação de exaustividade. Para resolver o aviso, é preciso tratar todos os casos. Para isso, pode-se usar o padrão de descarte, que é um padrão que corresponde a qualquer valor:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i if i < 0 -> "Negative number"
_ -> "Positive number"
}
}
// No compiler error
É possível corresponder a vários padrões em uma única cláusula, usando | para separar cada padrão. Só é possível adicionar uma 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
As expressões case testam um valor contra cada padrão, de cima para baixo, até encontrar um padrão correspondente e executar a lógica associada a ele. A ordem dos padrões importa!
Neste exercício, você está jogando um jogo de adivinhação de números com um amigo. As regras são simples: você escolhe um número em segredo entre 1 e 100, e seu amigo tenta adivinhar qual número você escolheu. Para ajudar seu amigo, você responde de forma diferente dependendo de quão perto o palpite chegou do número que você escolheu (42). Estas são as regras para as diferentes respostas:
42: "Correct"41 ou 43: "So close"41: "Too low"43: "Too high"Você tem quatro tarefas para codificar as respostas aos palpites.
Implemente a função reply para responder a um palpite correto:
reply(42)
// -> "Correct"
Modifique a função reply para responder a palpites próximos:
reply(41)
// -> "So close"
Modifique a função reply para responder a palpites muito baixos:
reply(25)
// -> "Too low"
Modifique a função reply para responder a palpites muito altos:
reply(88)
// -> "Too high"
Crie sua conta no Exercism para aprender e dominar Gleam com 33 conceitos122 exercícios e mentoria humana de verdade, tudo de graça.