تطابق التعبيرات (F#)

matchالتعبير يوفر تحكماً التفريعي الذي هو استناداً إلى comparهوon التعبير بالتعيين من الأنماط.

// Match expression.
match test-expression with
    | pattern1 [ when condition ] -> result-expression1
    | pattern2 [ when condition ] -> result-expression2
    | ...

// Pattern matching function.
function
    | pattern1 [ when condition ] -> result-expression1
    | pattern2 [ when condition ] -> result-expression2
    | ...

ملاحظات

السماح نمط المطابقة تعبير s المنطق التفريعي معقدة تستند المقارنة بين اختبار تعبير بالتعيين من الأنماط. في matchالتعبير، test-expressionهو بالمقارنة مع كل نمط في الدور، وعند مطابقة هو العثور على، المطابقة result-expressionهو تقييم والناتج القيمة هو التي يتم إرجاعها كقيمة مطابقة التعبير.

نقش مطابقة في دالة السابق هو بناء جملة تعبير lambda بنقش التي تطابق تنفذ مباشرة تشغيل وسيطة. نقش مطابقة دالة في بناء الجملة السابقة يكافئ التالية.

funarg->

مطابقة arg

| pattern1 whencondition] ->result-expression1

| pattern2 whencondition] ->result-expression2

| ...

لمزيد من المعلومات حول تعبير لامدا، راجع التعبيرات لامدا: الترفيه كلمة أساسية (F#).

يجب أن يغطي التعيين كاملة من النقوش الجميع يطابق الإمكان إدخال المتغير. Frequently, you استخدم the حرف بدل نقش (_) كـ the أخير نقش إلى مطابقة أي previously unmatched إدخال قيم.

The following تعليمات برمجية illustrates some of the ways في which the match تعبير هو used. For a مرجع و أمثلة of الجميع the possible أنماط that can be used, see الأنماط (F#).

let list1 = [ 1; 5; 100; 450; 788 ]

// Pattern matching by using the cons pattern and a list
// pattern that tests for an empty list.
let rec printList listx =
    match listx with
    | head :: tail -> printf "%d " head; printList tail
    | [] -> printfn ""

printList list1

// Pattern matching with multiple alternatives on the same line.  
let filter123 x =
    match x with
    | 1 | 2 | 3 -> printfn "Found 1, 2, or 3!"
    | a -> printfn "%d" a

// The same function written with the pattern matching
// function syntax.
let filterNumbers =
    function | 1 | 2 | 3 -> printfn "Found 1, 2, or 3!"
             | a -> printfn "%d" a

Guards تشغيل أنماط

You can استخدم a when clause إلى specify an إضافى شرط that the متغير must satisfy إلى مطابقة a نقش. Such a clause هو referred إلى كـ a حماية. The تعبير following the when كلمة أساسية ليس evaluated unless a مطابقة هو made إلى the نقش associated مع that حماية.

يوضح المثال التالي استخدام الحماية إلى تحديد نطاق رقمي لنمط متغير. ملاحظة أن يتم دمج شروط متعددة باستخدام العوامل المنطقية.

let rangeTest testValue mid size =
    match testValue with
    | var1 when var1 >= mid - size/2 && var1 <= mid + size/2 -> printfn "The test value is in range."
    | _ -> printfn "The test value is out of range."

rangeTest 10 20 5
rangeTest 10 20 10
rangeTest 10 20 40

لاحظ أنه نظراً لعدم إمكانية استخدام قيم مختلفة عن القيم الحرفية في نقش، يجب عليك استخدام whenجملة إذا كان لديك إلى مقارنة بعض أجزاء إدخال مقابل القيمة. يظهر هذا في التعليمات البرمجية التالية.

// This example uses patterns that have when guards.
let detectValue point target =
    match point with
    | (a, b) when a = target && b = target -> printfn "Both values match target %d." target
    | (a, b) when a = target -> printfn "First value matched target in (%d, %d)" target b
    | (a, b) when b = target -> printfn "Second value matched target in (%d, %d)" a target
    | _ -> printfn "Neither value matches target."
detectValue (0, 0) 0
detectValue (1, 0) 0
detectValue (0, 10) 0
detectValue (10, 15) 0

راجع أيضًا:

المرجع

أنماط النشطة (F#)

موارد أخرى

مرجع لغة ب #