case
في Gleam، يمكن استخدام تعبير case لتنفيذ الكود بشكل شرطي. باستخدام تعبير case يمكن اختبار قيمة مقابل نمط واحد أو أكثر من الأنماط. مثال على هذا النمط هو النمط الحرفي، الذي يطابق قيمة مقابل قيمة حرفية (مثل 1 أو "hello").
تُكتب تعبيرات case باستخدام الكلمة المفتاحية case:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
1 -> "One"
}
}
قد يبدو هذا مشابهًا لعبارات switch في لغات أخرى، لكن مطابقة الأنماط تتألق حقًا عند استخدام أنماط أخرى أيضًا. أحد هذه الأنماط هو النمط المتغير، الذي يسمح بإسناد قيمة إلى متغير. في هذا المثال، سيُسنَد إلى المتغير i قيمة number إذا لم تكن 0:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i -> "Non zero"
}
}
في بعض الحالات، قد ترغب في إضافة شرط إضافي إلى نمط. يُعرف هذا بـ الحارس (الجملة الحارسة)، ويمكن إضافته باستخدام الكلمة المفتاحية if:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i if i < 0 -> "Negative number"
}
}
لأسباب تتعلق بالأداء، لا يُسمح في الحراس إلا بالعوامل الرياضية والمنطقية الأساسية، ولا يمكن استخدام دوال أخرى في الحراس.
في المثال أعلاه، لن يكون لكل مدخل ممكن نمط مطابق. سيكتشف المترجم هذا ويُخرج خطأً. يُعرف هذا بـ التحقق الشامل. لحل التحذير، يجب معالجة جميع الحالات. لهذا، يمكن استخدام نمط التجاهل، وهو نمط يطابق أي قيمة:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i if i < 0 -> "Negative number"
_ -> "Positive number"
}
}
// No compiler error
يمكن مطابقة أنماط متعددة في جملة واحدة باستخدام | للفصل بين كل نمط. يمكن إضافة حارس واحد فقط إلى الجملة:
pub fn describe(number: Int) -> String {
let yell = True
case number {
0 -> "Zero"
3 | 5 -> "One of the first odd prime numbers"
2 | 4 | 6 | 8 if !yell -> "One of the even numbers less than 10"
i if i % 2 == 0 && yell -> "[Yelling] I'm telling you! It's a even nunber"
i if i < 0 -> "Negative number"
_ -> "Positive number"
}
}
// No compiler error
تختبر تعبيرات case قيمة ما مقابل كل نمط من الأعلى إلى الأسفل، حتى تجد نمطًا مطابقًا وتنفّذ المنطق المرتبط بذلك النمط. ترتيب الأنماط مهم!
في هذا التمرين، تلعب لعبة تخمين الأعداد مع صديق. القواعد بسيطة: تختار سرًّا عددًا بين 1 و 100، ويحاول صديقك تخمين العدد الذي اخترته. ولمساعدة صديقك، تُجيب بطريقة مختلفة حسب قرب التخمين من العدد الذي اخترته (42). وهذه هي قواعد الردود المختلفة:
42: "Correct"41 أو 43: "So close"41: "Too low"43: "Too high"أمامك أربع مهام لتحديد الردود على التخمينات.
نفّذ الدالة reply للرد على تخمين صحيح:
reply(42)
// -> "Correct"
عدّل الدالة reply للرد على التخمينات القريبة:
reply(41)
// -> "So close"
عدّل الدالة reply للرد على التخمينات المنخفضة جدًا:
reply(25)
// -> "Too low"
عدّل الدالة reply للرد على التخمينات المرتفعة جدًا:
reply(88)
// -> "Too high"
سجّل في Exercism لتتعلّم وتتقن Gleam عبر 33 مفهومًا122 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.