Rust ch17-2 · 패턴 반박 가능성

패턴은 값보다 먼저 놓인 자리 확인

`let`은 실패를 처리할 곳이 없고, `if let`과 `let else`는 실패했을 때의 흐름을 코드로 표현한다.

`let`에 `Some(x)`를 둔 경우

error
let Some(x) = some_option_value;
`None not covered`

`Option`에는 `None`이 있을 수 있으므로 이 패턴은 실패할 수 있다.

`let`은 매칭 실패 뒤에 실행할 대안을 가질 수 없어서 반박 불가능한 패턴만 받는다.

`if let`으로 실패를 건너뛰는 경우

valid
if let Some(x) = some_option_value {
  println!("{}", x);
}
`None`이면 블록을 실행하지 않음

패턴이 맞을 때만 본문을 실행하므로 실패가 자연스러운 분기 조건이 된다.

값이 없을 때 아무 일도 하지 않아도 되는 상황이면 이 형태가 가장 짧다.

항상 맞는 패턴을 `if let`에 둔 경우

warning
if let x = 5 {
  println!("{}", x);
}
`always match`

`x`는 어떤 값이든 받으므로 조건 분기로 쓸 이유가 없다.

컴파일러가 제안하듯 단순한 `let x = 5;`로 바꾸는 편이 의도가 선명하다.

let

실패할 수 없는 패턴

모든 값이 반드시 변수나 구조에 들어맞을 때 사용한다.

if let

실패하면 건너뛰기

`None`처럼 관심 없는 경우를 조용히 지나가도 될 때 맞다.

let else

실패하면 빠져나가기

값이 없으면 `return`, `break`, `panic!` 같은 탈출이 필요할 때 쓴다.

match

모든 경우를 나누기

마지막 갈래가 남은 값을 받아 전체 경우를 빠짐없이 덮는다.