Il tipo atom di Elixir rappresenta una costante fissa. Il valore di un atomo è semplicemente il suo nome. Questo ci offre un modo sicuro rispetto ai tipi per interagire con i dati. Gli atomi si possono definire così:
# All atoms are preceded with a ':' then follow with alphanumeric snake-cased characters
variable = :an_atom
Gli atomi sono rappresentati internamente da un numero intero in una tabella di ricerca, impostata automaticamente. Non è possibile modificare questo valore interno.
Spesso vogliamo scrivere codice che possa ramificarsi in base a una condizione. In Elixir ci sono molti modi per farlo, ma uno dei più semplici è usare cond/1.
Nella sua forma più semplice, cond valuta uno o più rami e segue il primo che restituisce 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
Se nessun ramo restituisce true, il runtime genera un errore.
Stai gestendo un sistema composto da alcune applicazioni che producono molti log. Vuoi scrivere un piccolo programma che aggreghi quei log e assegni loro un'etichetta in base al livello di gravità. Tutte le applicazioni del tuo sistema usano gli stessi codici di log, ma alcune applicazioni legacy non supportano tutti i codici.
| Codice del log | Etichetta del log | Supportato nelle applicazioni legacy? |
|---|---|---|
| 0 | trace | no |
| 1 | debug | sì |
| 2 | info | sì |
| 3 | warning | sì |
| 4 | error | sì |
| 5 | fatal | no |
| altro / non supportato | unknown | - |
Implementa la funzione LogLevel.to_label/2. Dovrebbe accettare un codice intero e un flag booleano che indica se il log proviene da un'applicazione legacy, e restituire l'etichetta di una riga di log come atomo.
I codici di log non specificati nella tabella dovrebbero restituire l'etichetta unknown. Anche i codici di log indicati nella tabella come non supportati nelle applicazioni legacy dovrebbero restituire l'etichetta unknown se il log proviene da un'applicazione legacy.
LogLevel.to_label(0, false)
# => :trace
LogLevel.to_label(0, true)
# => :unknown
Qualcuno deve essere avvisato quando succedono cose inaspettate.
Implementa la funzione LogLevel.alert_recipient/2 per determinare a chi deve essere inviato l'avviso. La funzione dovrebbe accettare un codice intero e un flag booleano che indica se il log proviene da un'applicazione legacy, e restituire il nome del destinatario come atomo.
Usa la funzione LogLevel.to_label/2 dell'attività precedente. Se l'etichetta del log è error o fatal, invia l'avviso al team ops. Se ricevi un log con etichetta unknown da un sistema legacy, invia l'avviso al team dev1, mentre le altre etichette unknown vanno inviate al team dev2. Tutte le altre etichette di log possono essere tranquillamente ignorate restituendo false.
LogLevel.alert_recipient(-1, true)
# => :dev1
LogLevel.alert_recipient(0, false)
# => false
Iscriviti a Exercism per imparare e padroneggiare Elixir con 58 concetti168 esercizi e il mentoring di persone reali, tutto gratis.