Sök…
Anmärkningar
Mönstermatchning är ett kraftfullt drag i många funktionella språk eftersom det ofta gör det möjligt att hantera grenning mycket kortfattat jämfört med att använda flera if
/ else if
/ else
stiluttalanden. Men med tillräckligt med alternativ och "när" vakter , kan Pattern Matching också bli ordbok och svår att förstå på ett ögonkast.
När detta händer kan F #: s aktiva mönster vara ett bra sätt att ge meningsfulla namn på matchande logik, vilket förenklar koden och också möjliggör återanvändning.
Matchningsalternativ
Mönstermatchning kan vara användbart för att hantera Alternativ:
let result = Some("Hello World")
match result with
| Some(message) -> printfn message
| None -> printfn "Not feeling talkative huh?"
Mönstermatchning kontrollerar hela domänen
let x = true
match x with
| true -> printfn "x is true"
ger en varning
C: \ Programfiler (x86) \ Microsoft VS-kod \ Untitled-1 (2,7): varning FS0025: Ofullständigt mönster matchar på detta uttryck. Till exempel kan värdet "falskt" indikera ett fall som inte täcks av mönstret.
Detta beror på att inte alla möjliga boolvärden täcktes.
booler kan uttryckligen listas men ints är svårare att lista ut
let x = 5
match x with
| 1 -> printfn "x is 1"
| 2 -> printfn "x is 2"
| _ -> printfn "x is something else"
här använder vi den speciella _
karaktären. _
Matchar alla andra möjliga fall.
_
Kan få dig till problem
överväga en typ vi skapar oss så det ser ut så här
type Sobriety =
| Sober
| Tipsy
| Drunk
Vi kanske skriver en match med expession som ser ut så här
match sobriety with
| Sober -> printfn "drive home"
| _ -> printfn "call an uber"
Ovanstående kod är vettig. Vi antar att om du inte är nykter bör du ringa en uber så vi använder _
att beteckna det
Senare refaktorerar vi vår kod till detta
type Sobriety =
| Sober
| Tipsy
| Drunk
| Unconscious
F # -kompilatorn bör ge oss en varning och uppmana oss att refaktorera vårt matchuttryck för att få personen att söka läkare. I stället behandlar matchuttrycket tyst den medvetslösa personen som om de bara var lustiga. Poängen är att du bör välja att uttryckligen lista upp fall när det är möjligt för att undvika logikfel.
Fall utvärderas från topp till botten och den första matchen används
Felaktig användning:
I följande utdrag kommer den sista matchen aldrig att användas:
let x = 4
match x with
| 1 -> printfn "x is 1"
| _ -> printfn "x is anything that wasn't listed above"
| 4 -> printfn "x is 4"
grafik
x är allt som inte anges ovan
Rätt användning:
Här kommer både x = 1
och x = 4
att träffa sina specifika fall, medan allt annat kommer att gå igenom till standardfallet _
:
let x = 4
match x with
| 1 -> printfn "x is 1"
| 4 -> printfn "x is 4"
| _ -> printfn "x is anything that wasn't listed above"
grafik
x är 4
När vakter låter dig lägga till godtyckliga villkor
type Person = {
Age : int
PassedDriversTest : bool }
let someone = { Age = 19; PassedDriversTest = true }
match someone.PassedDriversTest with
| true when someone.Age >= 16 -> printfn "congrats"
| true -> printfn "wait until you are 16"
| false -> printfn "you need to pass the test"