Der Typ atom in Elixir steht für eine feste Konstante. Der Wert eines Atoms ist einfach sein eigener Name. Das gibt uns eine typsichere Möglichkeit, mit Daten zu arbeiten. Atome kannst du so definieren:
# All atoms are preceded with a ':' then follow with alphanumeric snake-cased characters
variable = :an_atom
Atome werden intern durch eine Ganzzahl in einer Nachschlagetabelle dargestellt, die automatisch festgelegt wird. Es ist nicht möglich, diesen internen Wert zu ändern.
Oft wollen wir Code schreiben, der abhängig von einer Bedingung verzweigt. In Elixir gibt es dafür viele Möglichkeiten, aber eine der einfachsten ist cond/1.
In seiner einfachsten Form folgt cond dem ersten Pfad, der zu true ausgewertet wird, mit einem oder mehreren Zweigen:
cond do
x > 10 -> :this_might_be_the_way
y < 7 -> :or_that_might_be_the_way
true -> :this_is_the_default_way
end
Wenn kein Pfad zu true ausgewertet wird, wirft die Laufzeitumgebung einen Fehler.
Du betreibst ein System, das aus ein paar Anwendungen besteht, die viele Logs erzeugen. Du möchtest ein kleines Programm schreiben, das diese Logs zusammenfasst und ihnen Labels entsprechend ihrem Schweregrad zuweist. Alle Anwendungen in deinem System verwenden dieselben Log-Codes, aber einige der Legacy-Anwendungen unterstützen nicht alle Codes.
| Log-Code | Log-Label | In Legacy-Apps unterstützt? |
|---|---|---|
| 0 | trace | nein |
| 1 | debug | ja |
| 2 | info | ja |
| 3 | warning | ja |
| 4 | error | ja |
| 5 | fatal | nein |
| andere / nicht unterstützt | unknown | - |
Implementiere die Funktion LogLevel.to_label/2. Sie sollte eine Ganzzahl als Code und einen booleschen Wert entgegennehmen, der dir sagt, ob der Log von einer Legacy-App stammt, und das Label einer Logzeile als Atom zurückgeben.
Log-Codes, die nicht in der Tabelle angegeben sind, sollten ein unknown-Label zurückgeben. Log-Codes, die in der Tabelle als nicht in Legacy-Apps unterstützt angegeben sind, sollten ebenfalls ein unknown-Label zurückgeben, wenn der Log von einer Legacy-App stammt.
LogLevel.to_label(0, false)
# => :trace
LogLevel.to_label(0, true)
# => :unknown
Jemand muss benachrichtigt werden, wenn unerwartete Dinge passieren.
Implementiere die Funktion LogLevel.alert_recipient/2, um zu bestimmen, an wen der Alarm gesendet werden muss. Die Funktion sollte eine Ganzzahl als Code und einen booleschen Wert entgegennehmen, der dir sagt, ob der Log von einer Legacy-App stammt, und den Namen des Empfängers als Atom zurückgeben.
Verwende die Funktion LogLevel.to_label/2 aus der vorherigen Aufgabe. Wenn das Log-Label error oder fatal ist, sende den Alarm an das ops-Team. Wenn du einen Log mit einem unknown-Label von einem Legacy-System erhältst, sende den Alarm an das dev1-Team. Andere unknown-Labels sollten an das dev2-Team gesendet werden. Alle anderen Log-Labels kannst du getrost ignorieren, indem du false zurückgibst.
LogLevel.alert_recipient(-1, true)
# => :dev1
LogLevel.alert_recipient(0, false)
# => false
Melde dich bei Exercism an, um Elixir mit 58 Konzepte168 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.