수색…
비고
Pattern Matching은 여러 if
/ else if
/ else
스타일 구문을 사용하는 것과 비교하여 분기를 매우 간결하게 처리 할 수있게 해주므로 많은 함수 언어의 강력한 기능입니다. 그러나 충분한 옵션과 "언제"경호원이 주어 지 더라도 패턴 매칭은 장황하고 이해하기 어렵게 될 수 있습니다.
F #의 활성 패턴 은 일치하는 논리에 의미있는 이름을 부여하는 좋은 방법이 될 수 있습니다. 이는 코드를 단순화하고 재사용을 가능하게합니다.
일치 옵션
옵션을 처리하는 데 패턴 일치가 유용 할 수 있습니다.
let result = Some("Hello World")
match result with
| Some(message) -> printfn message
| None -> printfn "Not feeling talkative huh?"
전체 도메인이 포함 된 패턴 일치 검사
let x = true
match x with
| true -> printfn "x is true"
경고를 낳는다.
C : \ Program Files (x86) \ Microsoft VS 코드 \ Untitled-1 (2,7) : 경고 FS0025 : 불완전한 패턴이이 식과 일치합니다. 예를 들어, 값 'false'는 패턴 (들)에 의해 커버되지 않는 케이스를 나타낼 수있다.
가능한 모든 bool 값이 다 다루어지지 않았기 때문입니다.
bool은 명시 적으로 나열 될 수 있지만 int는 나열하기가 더 어렵습니다.
let x = 5
match x with
| 1 -> printfn "x is 1"
| 2 -> printfn "x is 2"
| _ -> printfn "x is something else"
여기서 우리는 특별한 _
문자를 사용합니다. _
은 다른 모든 가능한 경우와 일치합니다.
_
가 문제를 일으킬 수 있습니다.
우리가 스스로를 창조하는 유형을 생각해 보라.
type Sobriety =
| Sober
| Tipsy
| Drunk
우리는 다음과 같은 익스텐션과 일치하는 것을 쓸 수 있습니다.
match sobriety with
| Sober -> printfn "drive home"
| _ -> printfn "call an uber"
위의 코드는 의미가 있습니다. 우리는 당신이 냉정하지 않다면 우리는 _
을 사용하여
나중에이 코드를 리펙토링합니다.
type Sobriety =
| Sober
| Tipsy
| Drunk
| Unconscious
F # 컴파일러는 우리에게 경고를 주어야하며 우리가 환자의 진찰을받을 수 있도록 우리의 일치 표현을 리팩토링하도록 요청해야합니다. 대신 일치 표현식은 마치 의식이없는 사람을 조용히 취급합니다. 핵심은 논리적 오류를 피할 수있는 경우 명시 적으로 사례를 나열하도록 선택해야한다는 것입니다.
사례는 위에서 아래로 평가되며 첫 번째 경기가 사용됩니다.
잘못된 사용 :
다음 스 니펫에서 마지막 일치는 사용되지 않습니다.
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"
인쇄물
x는 위에 열거되지 않은 모든 것입니다.
올바른 사용법 :
여기에서 x = 1
과 x = 4
는 모두 특정 사례에 부딪히며 다른 모든 것은 기본 사례 _
:에 해당합니다.
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"
인쇄물
x는 4입니다.
경비원이 임의 조건을 추가 할 때
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"