نوع 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 را پیادهسازی کنید. این تابع باید یک کد عددی و یک پرچم «منطقی» بگیرد که به شما میگوید آیا لاگ از یک برنامهی قدیمی میآید، و برچسب یک خط لاگ را بهصورت یک «اتم» برگرداند.
کدهای لاگی که در جدول مشخص نشدهاند باید برچسب 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