Тип atom в Elixir представляє фіксовану константу. Значення атома - це просто його власна назва. Це дає нам типобезпечний спосіб взаємодіяти з даними. Атоми можна визначити так:
# All atoms are preceded with a ':' then follow with alphanumeric snake-cased characters
variable = :an_atom
Атоми внутрішньо представлені цілим числом у таблиці відповідностей, яке встановлюється автоматично. Змінити це внутрішнє значення неможливо.
Часто нам хочеться написати код, який може розгалужуватися залежно від умови. Хоча в Elixir є багато способів зробити це, один із найпростіших - скористатися cond/1.
У найпростішому випадку cond обирає перший шлях, який обчислюється як true, серед однієї або кількох гілок:
cond do
x > 10 -> :this_might_be_the_way
y < 7 -> :or_that_might_be_the_way
true -> :this_is_the_default_way
end
Якщо жоден шлях не обчислюється як true, середовище виконання спричиняє помилку.
Ми запускаємо систему, яка складається з кількох застосунків, що створюють багато логів. Хочемо написати невелику програму, яка збере ці логи разом і надасть їм мітки відповідно до рівня серйозності. Усі застосунки в нашій системі використовують однакові коди логів, але деякі застарілі застосунки підтримують не всі коди.
| Код логу | Мітка логу | Чи підтримується в застарілих застосунках? |
|---|---|---|
| 0 | trace | ні |
| 1 | debug | так |
| 2 | info | так |
| 3 | warning | так |
| 4 | error | так |
| 5 | fatal | ні |
| інший / не підтримується | unknown | - |
Реалізуйте функцію LogLevel.to_label/2. Вона має приймати код як ціле число та булеве значення (англ. Boolean) - прапорець, який вказує, чи надійшов лог від застарілого застосунку, - і повертати мітку рядка логу як атом.
Коди логів, не вказані в таблиці, мають повертати мітку unknown. Коди логів, вказані в таблиці як непідтримувані в застарілих застосунках, також мають повертати мітку unknown, якщо лог надійшов від застарілого застосунку.
LogLevel.to_label(0, false)
# => :trace
LogLevel.to_label(0, true)
# => :unknown
Когось потрібно повідомляти, коли трапляється щось несподіване.
Реалізуйте функцію LogLevel.alert_recipient/2, щоб визначити, кому потрібно надіслати сповіщення. Вона має приймати код як ціле число та булеве значення - прапорець, який вказує, чи надійшов лог від застарілого застосунку, - і повертати імʼя отримувача як атом.
Скористайтеся функцією LogLevel.to_label/2 з попереднього завдання. Якщо мітка логу - error або fatal, надішліть сповіщення команді ops. Якщо надійшов лог із міткою unknown від застарілої системи, надішліть сповіщення команді dev1, а інші мітки unknown надсилайте команді dev2. Усі інші мітки логів можна спокійно ігнорувати, повернувши false.
LogLevel.alert_recipient(-1, true)
# => :dev1
LogLevel.alert_recipient(0, false)
# => false
Зареєструйтеся на Exercism, щоб вивчати й опановувати Elixir, а також 58 концепцій168 вправ та справжнє наставництво від людей, і все це безкоштовно.