يتيح Elixir ممارسات مبدأ الفتح والإغلاق من خلال السماح للدوال بامتلاك عدة فروع، فبدلًا من منطق تحكّم مبعثر ومثبَّت في الكود، يمكن كتابة دوال موجّهة لإضافة السلوك أو إزالته بسهولة.
يقدّم Elixir فروع الدوال المتعددة و_الحُرّاس_ لكتابة:
def number(n) when n == 7 do
"Awesome, that's my favorite"
end
def number(_n) do
"That's not my favorite"
end
أثناء التنفيذ، سيختبر Elixir، من أعلى ملف المصدر إلى أسفله، أي فرع من فروع الدالة سيستدعيه.
المتغيرات غير المستخدمة ينبغي أن تُسبق بشرطة سفلية.
تُستخدم الحُرّاس لمنع Elixir من استدعاء الدوال بناءً على تقييم الوسائط بواسطة دوال الحُرّاس. تبدأ الحُرّاس بالكلمة المفتاحية when، تليها تعبير منطقي. دوال الحُرّاس هي دوال خاصة:
true أو false الصارمتين.يمكن العثور على قائمة بالحُرّاس الشائعة في توثيق Elixir. وهي تشمل فحوص الأنواع، والحساب الأساسي، والمقارنات، وعوامل منطقية صارمة.
يمكن للدوال أن تُعلن قيمًا افتراضية لواحد أو أكثر من الوسائط. لنلقِ نظرة على هذه الدالة:
def number(n \\ 13), do: "That's not my favorite"
عند الترجمة، يُنشئ Elixir تعريفًا للدالة number/0 (بدون وسائط)، وnumber/1 (وسيط واحد).
إذا كان لأكثر من وسيط قيمة افتراضية، فستُطبَّق القيم الافتراضية على الدالة من اليسار إلى اليمين لسدّ محل الوسائط الناقصة.
إذا كانت للدالة أكثر من فرع واحد، فينبغي تعريف الوسائط الافتراضية في ترويسة الدالة (دالة بدون جسم) قبل فروع الدالة:
def number(n \\ 13)
def number(n) when n < 10, do: "Dream bigger!"
def number(n) when n > 100, do: "Not that big..."
أنت تنشئ لعبة إلكترونية بسيطة يمكن لصديق أن يخمّن فيها عددًا سريًا. تريد تقديم بعض الملاحظات، لكن دون أن تكشف الإجابة عبر التخمين. عليك تصميم دالة تقدّم ردودًا مختلفة بناءً على علاقة التخمين بالعدد السري.
| الشرط | الرد |
|---|---|
| عندما يطابق التخمين العدد السري | "Correct" |
| عندما يكون التخمين أكبر من العدد السري بواحد أو أصغر منه بواحد | "So close" |
| عندما يكون التخمين أكبر من العدد السري | "Too high" |
| عندما يكون التخمين أصغر من العدد السري | "Too low" |
| عندما لا يُقدَّم أي تخمين | "Make a guess" |
جميع التخمينات والأعداد السرية أعداد صحيحة.
نفّذ الدالة compare/2 التي تأخذ وسيطين، secret_number و guess، وكلاهما أعداد صحيحة.
GuessingGame.compare(5, 5)
# => "Correct"
عدّل الدالة compare لتستجيب للتخمينات التي تكون أكبر من العدد السري.
GuessingGame.compare(5, 8)
# => "Too high"
عدّل الدالة compare لتستجيب للتخمينات التي تكون أصغر من العدد السري.
GuessingGame.compare(5, 2)
# => "Too low"
عدّل الدالة compare لتستجيب للتخمينات القريبة من العدد السري.
GuessingGame.compare(5, 6)
# => "So close"
GuessingGame.compare(5, 4)
# => "So close"
عدّل الدالة compare لتستجيب لغياب التخمين.
GuessingGame.compare(5)
# => "Make a guess"
GuessingGame.compare(5, :no_guess)
# => "Make a guess"
سجّل في Exercism لتتعلّم وتتقن Elixir عبر 58 مفهومًا168 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.