У Gleam вираз case можна використати, щоб умовно виконати код. За допомогою виразу case значення можна перевірити на відповідність одному або кільком зразкам. Приклад такого зразка — літеральний зразок, який зіставляє значення з літеральним значенням (наприклад, 1 або "hello").
Вирази case записують за допомогою ключового слова case:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
1 -> "One"
}
}
Хоча це може мати вигляд switch-інструкцій в інших мовах, зіставлення зі зразками розкриває свої переваги тоді, коли ми використовуємо й інші зразки. Один із таких зразків — зразок-змінна, який дозволяє присвоїти значення змінній. У цьому прикладі змінна i отримає значення number, якщо воно не дорівнює 0:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i -> "Non zero"
}
}
У деяких випадках може знадобитися додати до зразка додаткову умову. Це називається сторожовою умовою (guard clause), яку можна додати за допомогою ключового слова if:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i if i < 0 -> "Negative number"
}
}
З міркувань продуктивності у сторожових умовах дозволені лише базові математичні та булеві оператори, а інші функції використовувати в них не можна.
У наведеному вище прикладі не для всіх можливих вхідних даних знайдеться відповідний зразок. Компілятор це виявить і видасть помилку. Це називається перевіркою вичерпності. Щоб позбутися цього попередження, потрібно обробити всі випадки. Для цього можна скористатися зразком-відкиданням, який збігається з будь-яким значенням:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i if i < 0 -> "Negative number"
_ -> "Positive number"
}
}
// No compiler error
В одній гілці можна зіставити кілька зразків, розділяючи їх знаком |. До однієї гілки можна додати лише одну сторожову умову:
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
Вирази case перевіряють значення на відповідність кожному зразку згори донизу, доки не знайдуть відповідний зразок і не виконають логіку, повʼязану з ним. Порядок зразків має значення!
У цій вправі ми граємо з другом у гру на вгадування чисел. Правила прості: ми потай загадуємо число від 1 до 100, а наш друг намагається вгадати, яке число ми загадали. Щоб допомогти другові, ми відповідаємо по-різному залежно від того, наскільки близьким було припущення до загаданого числа (42). Ось правила для різних відповідей:
42: «Correct»41 або 43: «So close»41: «Too low»43: «Too high»На нас чекають чотири завдання, у яких ми закодуємо відповіді на припущення.
Реалізуйте функцію reply, щоб вона відповідала на правильне припущення:
reply(42)
// -> "Correct"
Змініть функцію reply, щоб вона відповідала на близькі припущення:
reply(41)
// -> "So close"
Змініть функцію reply, щоб вона відповідала на занизькі припущення:
reply(25)
// -> "Too low"
Змініть функцію reply, щоб вона відповідала на зависокі припущення:
reply(88)
// -> "Too high"
Зареєструйтеся на Exercism, щоб вивчати й опановувати Gleam, а також 33 концепції122 вправи та справжнє наставництво від людей, і все це безкоштовно.