cases

술어와 매퍼로 이루어진 디스패치 테이블을 만듭니다. 기본값도 선택적으로 지정할 수 있습니다.

R Function(T value) cases<T, R>(List<(bool Function(T), R Function(T))> pairs, {R Function(T)? orElse})

강의

cases(predicate, mapper) 쌍의 목록으로 매처를 만듭니다. 각 쌍을 순서대로 시도해서, 술어가 참을 반환하는 첫 번째 쌍의 매퍼를 적용해 결과를 만듭니다. if/else if 연쇄를 함수형으로 대체하는 도구이며, map과도 잘 어울립니다 — 반환값이 그대로 넘길 수 있는 평범한 단항 함수 T -> R이기 때문입니다.

이 형태는 FxTS와 의도적으로 다릅니다. FxTS의 cases는 가변 인자를 받습니다. [predicate, mapper] 쌍 하나하나가 개별 인자이고, 마지막에 함수 하나를 그대로 넘기면 기본값 역할을 하며, TypeScript는 오버로드된 제네릭으로 각 인자 개수를 일일이 타이핑합니다. Dart에는 가변 제네릭도, 인자 개수별 오버로드도 없어서 "쌍 인자를 몇 개든" 받으면서 제대로 된 타입 검사까지 유지할 방법이 없습니다. 그래서 FxDart 버전은 대신 List 하나를 받습니다. 그 안에는 (predicate, mapper) 레코드, 즉 Dart의 튜플 타입이 들어갑니다. 여기에 더해, 기본값이 또 하나의 쌍으로 오해되지 않도록 별도의 명명 매개변수 orElse를 둡니다.

아무것도 매치되지 않고 orElse도 주어지지 않으면 casesvalue 자체를 반환하려 합니다 — 이는 T가 마침 R도 만족할 때에만 호출 지점에서 컴파일되며, 그렇지 않으면 런타임에 StateError를 던집니다. 실무에서는 술어가 모든 경우를 빠짐없이 다룬다고 확신할 수 있는 게 아니라면 항상 orElse를 넘기세요.

데모 1 · 기본

데모 2 · 성적 처리 파이프라인

직접 해 보기

연습: 각 크기를 'small'(<10), 'medium'(<30), 'large'로 분류해 보세요.

관련 항목: when / unless — 술어 하나, 결과 타입은 동일 · throwError — 매치 실패가 치명적이어야 할 때 흔히 쓰는 orElse · always — 상수 orElse · matches — case에 끼워 넣을 수 있는 술어