Skip to content

Pattern Matching

정교한 조건 검사와 데이터 언패킹(Destructuring)을 위해 제공되는 match 구문입니다. 입력된 값과 일치하는 첫 번째 패턴 블록이 실행됩니다.

IMPORTANT

망라성 검사 (Exhaustiveness Checking) Zephyr 컴파일러는 match 구문이 대상 Enum이나 범위가 가질 수 있는 모든 경우의 수를 완벽하게 다뤘는지 검사합니다. 만약 누락된 경우가 있다면 컴파일 에러가 발생합니다. 처리하지 않을 나머지는 와일드카드 기호 _ 로 명시해야 합니다.

리터럴과 범위 (Ranges)

숫자, 문자열 등 직접적인 리터럴 일치 여부를 비롯해 범위 연산자 ..=를 사용한 패턴을 작성할 수 있습니다.

zephyr
let score = 85;
match score {
    90..=100 => print("A"),
    80..=89  => print("B"),
    70..=79  => print("C"),
    _        => print("F"),
}

구조 분해 (Destructuring)

열거형(Enum) 내부의 Payload 데이터나, 구조체(Struct), 튜플(Tuple) 내부의 데이터들을 match 스코프 내부의 로컬 변수로 즉시 추출할 수 있습니다.

열거형 패턴

zephyr
enum Message {
    Quit,
    Move(int, int),
    Write(string),
}

let msg = Message::Move(10, 20);

match msg {
    Message::Quit        => print("quit"),
    Message::Move(x, y)  => print(f"move to {x},{y}"),
    Message::Write(text) => print(text),
}

구조체 패턴

선별적으로 특정 필드의 일치 여부만 지정하고(x: 0), 나머지는 추출(y)하도록 구성할 수 있습니다.

zephyr
struct Point { x: int, y: int }
let p = Point { x: 0, y: 5 };

match p {
    Point { x: 0, y } => print(f"on y-axis at {y}"),
    Point { x, y: 0 } => print(f"on x-axis at {x}"),
    Point { x, y }    => print(f"at ({x}, {y})"),
}

튜플 및 배열 패턴

zephyr
// 튜플 구조 분해 및 값 매칭
let pair = (true, 42);
match pair {
    (true, n)  => print(f"yes: {n}"),
    (false, n) => print(f"no: {n}"),
}

// 배열 패턴 매칭
match [1, 2, 3] {
    [1, x, y] => print(f"1로 시작하여 {x}, {y}가 뒤따름"),
    _         => print("기타"),
}

가드 조건 (Guard Conditions)

패턴 매칭 성공 여부에 추가적으로 if 기반 임의 수식을 요구할 수 있습니다.

zephyr
let n = 7;
match n {
    x if x % 2 == 0 => print(f"{x} is even"),
    x                => print(f"{x} is odd"),
}

Result<T> 오류 핸들링 활용

일반적인 예외 발생(throw)을 사용하지 않는 Zephyr 특성 때문에 연산 성공/실패 계통의 언패킹에도 자주 쓰입니다.

zephyr
match divide(10, 0) {
    Ok(v)    => print(f"성공: {v}"),
    Err(msg) => print(f"실패: {msg}"),
}