In Gleam un'espressione case può essere usata per eseguire del codice in modo condizionale. Con un'espressione case un valore può essere confrontato con uno o più pattern. Un esempio di tale pattern è il pattern letterale, che confronta un valore con un valore letterale (ad esempio 1 o "hello").
Le espressioni case si scrivono con la parola chiave case:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
1 -> "One"
}
}
Anche se questo può sembrare simile alle istruzioni switch di altri linguaggi, il pattern matching dà il meglio di sé quando si usano anche altri pattern. Uno di questi pattern è il pattern variabile, che permette di assegnare un valore a una variabile. In questo esempio, alla variabile i verrà assegnato il valore di number se non è 0:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i -> "Non zero"
}
}
In alcuni casi potresti voler aggiungere una condizione ulteriore a un pattern. Questa è nota come guardia (clausola) e si può aggiungere usando la parola chiave if:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i if i < 0 -> "Negative number"
}
}
Per motivi di prestazioni, nelle guardie sono ammessi solo gli operatori matematici e booleani di base: non è possibile usare altre funzioni nelle guardie.
Nell'esempio sopra, non tutti gli input possibili avranno un pattern corrispondente. Il compilatore lo rileva e segnala un errore. Questo si chiama controllo di esaustività. Per risolvere l'avviso, bisogna gestire tutti i casi. Per questo si può usare il pattern jolly, che è un pattern che corrisponde a qualsiasi valore:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i if i < 0 -> "Negative number"
_ -> "Positive number"
}
}
// No compiler error
In una stessa clausola si possono confrontare più pattern, usando | per separarli. A una clausola si può aggiungere una sola guardia:
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
Le espressioni case confrontano un valore con ciascun pattern dall'alto verso il basso, finché non trovano un pattern corrispondente ed eseguono la logica associata a quel pattern. L'ordine dei pattern è importante!
In questo esercizio, giocherai a indovinare un numero con un amico. Le regole sono semplici: scegli in segreto un numero tra 1 e 100 e il tuo amico prova a indovinare quale numero hai scelto. Per aiutare il tuo amico, rispondi in modo diverso a seconda di quanto il tentativo si avvicina al numero che hai scelto (42). Queste sono le regole per le diverse risposte:
42: "Correct"41 o 43: "So close"41: "Too low"43: "Too high"Hai quattro attività per codificare le risposte ai tentativi.
Implementa la funzione reply per rispondere a un tentativo corretto:
reply(42)
// -> "Correct"
Modifica la funzione reply per rispondere ai tentativi vicini:
reply(41)
// -> "So close"
Modifica la funzione reply per rispondere ai tentativi troppo bassi:
reply(25)
// -> "Too low"
Modifica la funzione reply per rispondere ai tentativi troppo alti:
reply(88)
// -> "Too high"
Iscriviti a Exercism per imparare e padroneggiare Gleam con 33 concetti122 esercizi e il mentoring di persone reali, tutto gratis.