case
En Gleam, une expression case permet d'exécuter du code de façon conditionnelle. Avec une expression case, on peut comparer une valeur à un ou plusieurs motifs. Un exemple d'un tel motif est le motif littéral, qui compare une valeur à une valeur littérale (par exemple 1 ou "hello").
Les expressions case s'écrivent avec le mot-clé case :
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
1 -> "One"
}
}
Bien que cela puisse ressembler aux instructions switch d'autres langages, le filtrage par motif révèle tout son intérêt lorsqu'on utilise aussi d'autres motifs. L'un de ces motifs est le motif de variable, qui permet d'affecter une valeur à une variable. Dans cet exemple, la variable i reçoit la valeur de number si celui-ci n'est pas 0 :
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i -> "Non zero"
}
}
Dans certains cas, on peut vouloir ajouter une condition supplémentaire à un motif. C'est ce qu'on appelle une garde (clause), que l'on peut ajouter avec le mot-clé if :
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i if i < 0 -> "Negative number"
}
}
Pour des raisons de performance, seuls les opérateurs mathématiques et booléens de base sont autorisés dans les gardes ; aucune autre fonction ne peut y être utilisée.
Dans l'exemple ci-dessus, certaines entrées possibles n'ont aucun motif correspondant. Le compilateur le détecte et produit une erreur. C'est ce qu'on appelle la vérification d'exhaustivité. Pour corriger l'avertissement, il faut gérer tous les cas. Pour cela, on peut utiliser le motif joker, un motif qui correspond à n'importe quelle valeur :
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i if i < 0 -> "Negative number"
_ -> "Positive number"
}
}
// No compiler error
On peut comparer plusieurs motifs dans une même clause en les séparant par |. Une clause ne peut contenir qu'une seule garde :
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
Les expressions case comparent une valeur à chaque motif, de haut en bas, jusqu'à ce qu'elles trouvent un motif correspondant et exécutent la logique associée à ce motif. L'ordre des motifs est important !
Dans cet exercice, tu joues avec un ami à un jeu où il faut deviner un nombre. Les règles sont simples : tu choisis secrètement un nombre entre 1 et 100, et ton ami essaie de deviner lequel. Pour aider ton ami, tu réponds différemment selon la proximité entre la supposition et le nombre que tu as choisi (42). Voici les règles pour les différentes réponses :
42 : « Correct »41 ou 43 : « So close »41 : « Too low »43 : « Too high »Tu as quatre tâches pour coder les réponses aux suppositions.
Implémente la fonction reply pour répondre à une supposition correcte :
reply(42)
// -> "Correct"
Modifie la fonction reply pour répondre aux suppositions proches :
reply(41)
// -> "So close"
Modifie la fonction reply pour répondre aux suppositions trop basses :
reply(25)
// -> "Too low"
Modifie la fonction reply pour répondre aux suppositions trop hautes :
reply(88)
// -> "Too high"
Inscris-toi sur Exercism pour apprendre et maîtriser Gleam avec 33 concepts122 exercices, et un vrai mentorat humain, le tout gratuitement.