Elixir допомагає дотримуватися принципу відкритості-закритості, дозволяючи функціям мати кілька клауз. Тож замість розростання й жорстко закодованої логіки керування можна писати точкові функції, щоб легко додавати і прибирати поведінку.
Elixir пропонує кілька клауз функції та охоронні вирази, щоб писати:
def number(n) when n == 7 do
"Awesome, that's my favorite"
end
def number(_n) do
"That's not my favorite"
end
Під час виконання Elixir перевірятиме згори донизу вихідного файлу, яку клаузу функції викликати.
Змінні, які не використовуються, слід починати з підкреслення.
Охоронні вирази використовують, щоб Elixir не викликав функції на основі оцінювання аргументів охоронними функціями. Охоронні вирази починаються з ключового слова when, за яким іде булевий вираз (англ. Boolean). Охоронні функції - це спеціальні функції, які:
true або false.Список поширених охоронних виразів можна знайти в документації Elixir. Він охоплює перевірки типів, базову арифметику, порівняння та строго булеві оператори.
Функції можуть оголошувати типові значення для одного або кількох аргументів. Розгляньмо цю функцію:
def number(n \\ 13), do: "That's not my favorite"
Під час компіляції Elixir створює визначення функції для number/0 (без аргументів) і number/1 (з одним аргументом).
Якщо більш ніж один аргумент має типові значення, ці значення застосовуються до функції зліва направо, щоб заповнити пропущені аргументи.
Якщо функція має більше ніж одну клаузу, типові аргументи слід визначити в заголовку функції (функції без тіла) перед клаузами функції:
def number(n \\ 13)
def number(n) when n < 10, do: "Dream bigger!"
def number(n) when n > 100, do: "Not that big..."
Ми створюємо просту онлайн-гру, у якій друг може вгадати секретне число. Хочеться дати трохи зворотного звʼязку, але не видати відповідь самою здогадкою. Нам потрібно розробити функцію, яка даватиме різні відповіді залежно від того, як здогадка співвідноситься із секретним числом.
| Умова | Відповідь |
|---|---|
| Коли здогадка збігається із секретним числом | "Correct" |
| Коли здогадка на одиницю більша або на одиницю менша за секретне число | "So close" |
| Коли здогадка більша за секретне число | "Too high" |
| Коли здогадка менша за секретне число | "Too low" |
| Коли здогадку не зроблено | "Make a guess" |
Усі здогадки та секретні числа є цілими числами.
Реалізуйте функцію compare/2, яка приймає два аргументи, secret_number і guess, обидва з яких є цілими числами.
GuessingGame.compare(5, 5)
# => "Correct"
Змініть функцію compare, щоб вона відповідала на здогадки, більші за секретне число.
GuessingGame.compare(5, 8)
# => "Too high"
Змініть функцію compare, щоб вона відповідала на здогадки, менші за секретне число.
GuessingGame.compare(5, 2)
# => "Too low"
Змініть функцію compare, щоб вона відповідала на здогадки, близькі до секретного числа.
GuessingGame.compare(5, 6)
# => "So close"
GuessingGame.compare(5, 4)
# => "So close"
Змініть функцію compare, щоб вона відповідала на відсутність здогадки.
GuessingGame.compare(5)
# => "Make a guess"
GuessingGame.compare(5, :no_guess)
# => "Make a guess"
Зареєструйтеся на Exercism, щоб вивчати й опановувати Elixir, а також 58 концепцій168 вправ та справжнє наставництво від людей, і все це безкоштовно.