Udostępnij za pośrednictwem


Wyrażenia dopasowania (F#)

match Wyrażenie zawiera rozgałęzioną formant, który jest oparty na porównanie wyrażenia z zestawem deseni.

// 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
    | ...

Uwagi

Wzorzec wyrażenia pasujące umożliwiają rozgałęzianie złożone na podstawie porównania wyrażenie testowe z zestawem deseni.W match wyrażenie, test-expression jest porównywana z każdego wzorca, z kolei, a gdy zostanie znaleziony odpowiednik, odpowiadające im result-expression jest oceniany i zwracana jest wartość wynikową wartość wyrażenie dopasowania.

Funkcja w poprzednim składni dopasowania wzorca jest wyrażenie lambda, w który deseń dopasowania jest wykonywane bezpośrednio w argumencie.Funkcja w poprzednim składni dopasowania wzorca jest równoważne z następujących czynności.

fun arg ->

odpowiada arg z

| pattern1 whencondition -> result-expression1

| pattern2 whencondition-> result-expression2

| ...

Aby uzyskać więcej informacji na temat wyrażeń lambda, zobacz Wyrażenia lambda: fun — Słowo kluczowe (F#).

Cały zestaw wzorców powinny obejmować wszystkie możliwe zgodny ze zmienną wejściową.Często należy użyć deseniu symboli wieloznacznych (_) jako deseń ostatniego odpowiadać wartości wejściowe wcześniej niedopasowane.

Poniższy kod ilustruje niektóre sposoby, w którym match jest używane wyrażenie.Odwołanie i przykłady wszystkie możliwe desenie, które mogą być używane, zobacz Dopasowanie wzorca (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

Osłony na wzorce

Można użyć when klauzuli, aby określić dodatkowy warunek, że zmienna musi spełniać wzorcem.Klauzuli taki nazywa się Zabezpieczenia.Następujące wyrażenie when słowo kluczowe nie jest sprawdzane, chyba, że zgodność ma miejsce w strukturze skojarzonych z tym guard.

Poniższy przykład ilustruje użycie guard, aby określić zakres liczbowych zmiennej wzorek.Należy zauważyć, że wiele warunków są połączone przy użyciu operatorów logicznych.

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

Należy zauważyć, że ponieważ wartości inne niż literały nie używanych w deseniu, należy użyć when klauzuli, jeśli trzeba porównać pewnej części danych wejściowych przed wartością.To jest pokazane w poniższym kodzie.

// 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

Zobacz też

Informacje

Wzorce aktywne (F#)

Inne zasoby

Materiały referencyjne dotyczące języka F#