Elixir 的atom型別代表一個固定的常數。原子的值就是它本身的名稱。這讓我們能以型別安全的方式與資料互動。原子可以像這樣定義:
# 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函式。它應該接受一個整數代碼,以及一個指出日誌是否來自舊版應用程式的布林旗標,並以 atom 的形式回傳該筆日誌的標籤。
表中未指定的日誌代碼應回傳 unknown 標籤。表中標示為舊版應用程式不支援的日誌代碼,如果日誌來自舊版應用程式,也應回傳 unknown 標籤。
LogLevel.to_label(0, false)
# => :trace
LogLevel.to_label(0, true)
# => :unknown
當意料之外的事情發生時,總得有人收到通知。
實作LogLevel.alert_recipient/2函式,判斷警示需要傳送給誰。這個函式應該接受一個整數代碼,以及一個指出日誌是否來自舊版應用程式的布林旗標,並以 atom 的形式回傳收件者的名稱。
請使用上一個任務的LogLevel.to_label/2函式。如果日誌標籤是 error 或 fatal,就把警示傳送給 ops 團隊。如果你收到來自舊版系統、標籤為 unknown 的日誌,就把警示傳送給 dev1 團隊;其他標籤為 unknown 的日誌則應傳送給 dev2 團隊。其他所有日誌標籤都可以安全地忽略,只要回傳 false 即可。
LogLevel.alert_recipient(-1, true)
# => :dev1
LogLevel.alert_recipient(0, false)
# => false