match 는 Rust 의 제일 강력한 제어 흐름 도구야. 값을 패턴들과 비교해서 맞는 첫 arm 을 돌려 — 근데 그 초능력은 컴파일러가 모든 경우를 덮게 강제한다는 거야.
match 는 표현식이야
if 처럼 match 도 값을 만들어서 결과를 할당할 수 있어. 각 arm 은 패턴 => 표현식 이고. 패턴은 variant 안의 데이터를 바인딩할 수 있어: Some(n) => ... 는 안쪽 값을 n 으로 꺼내서 그 arm 에서 쓸 준비를 해줘.
망라성이 마법이야
match 는 모든 가능한 경우를 처리해야 해, 안 그럼 컴파일 안 돼. Option 에 match 하면서 None 을 까먹어? 컴파일 에러. enum 을 바꾸기 전엔 깐깐하게 들려: variant 를 더하면 컴파일러가 즉시 모든 경우를 더는 안 덮는 모든 match 를 나열해. 리팩터링이 까먹은 자리 사냥이 아니라 안내된 체크리스트가 돼.
망라성이 '경우 까먹음' 을 컴파일 에러로 바꿔. 다른 언어에서 빠진
else 나 처리 안 된 enum 값에 숨는 버그가 여기선 컴파일을 못 버텨. variant 를 더하면 컴파일러가 할 일 목록을 건네줘.조심해서 쓰는 와일드카드
_ 는 뭐든 매칭하고 '남은 모든 경우' 라고 말하는 법이야. 쓸모 있지만, 미래 variant 에 대한 망라성 검사를 옵트아웃하기도 해 — 새 variant 를 더하면 _ arm 이 조용히 삼켜버려. '나머지 전부' 를 진짜로 뜻할 때 _ 를 써; 나중에 컴파일러가 상기시켜주길 원하면 variant 를 또박또박 적어.