패턴 위치가 “실패해도 되는가”와 실패 뒤 제어 흐름을 결정한다

패턴은 값을 분해해 이름을 묶는 문법이고, context는 일부 값에서 매칭 실패가 가능한 refutable pattern을 허용할지 정한다.

Irrefutable · 항상 성공

x, (a, b)처럼 해당 타입의 모든 값과 맞는다. 실패 경로가 없는 let·함수 인수·for에 필요하다.

Refutable · 일부만 성공

Some(x), literal, range처럼 틀릴 수 있다. match·if let·while let·let else가 실패를 처리한다.

match각 arm은 실패 가능, 전체는 exhaustive
if let한 경우 실행, 실패는 else 또는 무시
while let성공 동안 반복, 실패하면 종료
let else실패 block은 return·break처럼 diverge
let / 인수모든 입력과 맞아야 바인딩 가능
for모든 Iterator::Item과 맞으며 즉시 분해

값의 타입가능한 variant·shape

실패 가능성모든 값과 맞는가?

제어 흐름arm·else·종료·compile error

E0005를 만나면 pattern을 irrefutable하게 바꾸거나, 실패 경로를 표현하는 match·if let·let else로 context를 바꾼다.