cases
술어와 매퍼로 이루어진 디스패치 테이블을 만듭니다. 기본값도 선택적으로 지정할 수 있습니다.
강의
cases는 (predicate, mapper) 쌍의 목록으로
매처를 만듭니다. 각 쌍을 순서대로 시도해서, 술어가 참을 반환하는
첫 번째 쌍의 매퍼를 적용해 결과를 만듭니다.
if/else if 연쇄를 함수형으로 대체하는
도구이며, map과도 잘 어울립니다 — 반환값이 그대로
넘길 수 있는 평범한 단항 함수 T -> R이기 때문입니다.
이 형태는 FxTS와 의도적으로 다릅니다. FxTS의
cases는 가변 인자를 받습니다. [predicate, mapper]
쌍 하나하나가 개별 인자이고, 마지막에 함수 하나를 그대로 넘기면
기본값 역할을 하며, TypeScript는 오버로드된 제네릭으로 각 인자 개수를
일일이 타이핑합니다. Dart에는 가변 제네릭도, 인자 개수별 오버로드도
없어서 "쌍 인자를 몇 개든" 받으면서 제대로 된 타입 검사까지
유지할 방법이 없습니다. 그래서 FxDart 버전은 대신
List 하나를 받습니다. 그 안에는 (predicate, mapper)
레코드, 즉 Dart의 튜플 타입이 들어갑니다. 여기에 더해,
기본값이 또 하나의 쌍으로 오해되지 않도록
별도의 명명 매개변수 orElse를 둡니다.
아무것도 매치되지 않고 orElse도 주어지지 않으면
cases는 value 자체를 반환하려 합니다 —
이는 T가 마침 R도 만족할 때에만 호출 지점에서
컴파일되며, 그렇지 않으면 런타임에 StateError를 던집니다.
실무에서는 술어가 모든 경우를 빠짐없이 다룬다고 확신할 수 있는 게
아니라면 항상 orElse를 넘기세요.
데모 1 · 기본
데모 2 · 성적 처리 파이프라인
직접 해 보기
연습: 각 크기를 'small'(<10),
'medium'(<30), 'large'로 분류해 보세요.
when / unless — 술어 하나, 결과 타입은 동일 ·
throwError — 매치 실패가 치명적이어야 할 때 흔히 쓰는 orElse ·
always — 상수 orElse ·
matches — case에 끼워 넣을 수 있는 술어