يمثّل النوع 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
سجّل في Exercism لتتعلّم وتتقن Elixir عبر 58 مفهومًا168 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.