المسارات
/
F#
F#
/
المنهج
/
مطابقة الأنماط
مط

مطابقة الأنماط في F#

1 تمرين

نبذة عن مطابقة الأنماط

يمكن استخدام تعبير if/elif/else لتنفيذ منطق ما بشكل شرطي. وللغة F# أيضًا طريقة أخرى أقوى لتنفيذ المنطق بشكل شرطي: مطابقة الأنماط. باستخدام مطابقة الأنماط، يمكن اختبار قيمة ما مقابل نمط واحد أو أكثر. ومن أمثلة هذه الأنماط النمط الثابت، وهو يطابق قيمة ما مقابل ثابت (مثل 1 أو "hello").

في F#، تتم مطابقة الأنماط باستخدام الكلمة المفتاحية match:

let describe number =
    match number with
    | 0 -> "Zero"
    | 1 -> "One"

قد يبدو هذا مشابهًا لعبارات switch في لغات أخرى، لكن مطابقة الأنماط تُظهر قوتها عندما نستخدم أنماطًا أخرى أيضًا. ومن هذه الأنماط النمط المتغير، الذي يتيح لك التقاط قيمة:

match number with
| 0 -> "Zero"
| i -> sprintf "Non zero: %d" i

في بعض الحالات، قد ترغب في إضافة شرط إضافي إلى النمط. ويُعرف هذا باسم الحارس (أو الشرط الحارس)، ويمكن إضافته باستخدام الكلمة المفتاحية when:

match number with
| 0 -> "Zero"
| i when i < 0 -> "Negative number"

يمكن أن تكون جملة الحارس أي تعبير صالح، بما في ذلك استدعاء الدوال.

في المثال أعلاه، لن يكون لكل المدخلات الممكنة نمط مطابق. سيكتشف المُصرِّف ذلك ويُصدر تحذيرًا. ويُعرف هذا بـالمطابقة الشاملة. ولإزالة التحذير، عليك معالجة جميع الحالات. ولهذا يمكن استخدام [نمط البديل][wildcard-pattern]، وهو نمط يطابق أي قيمة:

match number with
| i when i < 0 -> "Negative number"
| _ -> "Positive number"

// No compiler warning

لاحظ أن المُصرِّف لا يستطيع استخدام جمل when لاستنتاج الشمول:

match number with
| i when i < 0 -> "Negative number"
| i when i >= 0 -> "Positive number"

// Compiler warning

تختبر مطابقة الأنماط القيمة مقابل كل نمط من الأعلى إلى الأسفل، حتى تجد نمطًا مطابقًا وتنفّذ المنطق المرتبط به. ترتيب الأنماط مهم! لذلك يجب أن يكون نمط التجاهل دائمًا آخر نمط في تعبير match.

ورغم أن مطابقة الأنماط قوية جدًا، فإن المنطق الشرطي البسيط يمكن التعبير عنه عادةً بوضوح أكبر باستخدام تعبير if/else:

let usingPatternMatching number =
    match number with
    | 0 -> "Zero"
    | _ -> "Non-zero"

let usingIfElse number = if number = 0 then "Zero" else "Non-zero"
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة

تعلّم مطابقة الأنماط