স্কিপ করে মূল কন্টেন্ট এ যান

Match 문

소개

match 문은 하나의 값을 여러 패턴과 비교해 분기하는 제어문입니다. if / else if 체인보다 분기 의도를 더 명확하게 표현할 때 유용합니다.

현재 Wave의 matchstatement(문) 이며, 값으로 직접 평가되는 expression 형태는 지원하지 않습니다. 즉, var x = match (...) { ... } 같은 형태는 사용할 수 없습니다.


기본 문법

match (값) {
패턴1 => {
// 실행 블록
}
패턴2 => {
// 실행 블록
}
_ => {
// 기본(default) 블록
}
}

문법 규칙:

  • 헤더는 match (expr) 형태를 사용합니다.
  • 각 arm은 패턴 => { 블록 } 형태를 사용합니다.
  • arm 본문은 반드시 { ... } 블록이어야 합니다.
  • arm 사이에는 줄바꿈만 써도 되고, , 또는 ;를 구분자로 써도 됩니다.

패턴 종류

현재 지원되는 패턴은 아래 3가지입니다.

  1. 정수 리터럴 패턴
0 => { ... }
1 => { ... }
42 => { ... }
  1. 식별자 패턴
Off => { ... }
On => { ... }

식별자 패턴은 enum variant 같은 정수 상수로 해석 가능한 값을 대상으로 사용합니다.

  1. 와일드카드 패턴 (_)
_ => { ... }

어떤 패턴에도 매칭되지 않았을 때 실행되는 기본 arm입니다.


매칭 대상 타입

현재 구현 기준으로 match의 대상 값은 정수 계열/enum 계열이어야 합니다. 문자열, 부동소수점, 구조체 등은 match 대상으로 사용할 수 없습니다.


예제 1: 정수 분기

fun classify_num(v: i32) -> i32 {
var result: i32 = -1;

match (v) {
0 => {
result = 10;
}
1 => {
result = 20;
}
_ => {
result = 99;
}
}

return result;
}

예제 2: enum 분기

enum Mode -> i32 {
Off = 0,
On = 1,
Unknown = 2
}

fun classify_mode(m: Mode) -> i32 {
match (m) {
Off => {
return 1;
}
On => {
return 2;
}
_ => {
return 3;
}
}
}

동작 규칙

  • switch 계열과 유사하게 일치하는 arm 하나만 실행됩니다.
  • 자동 fallthrough는 없습니다.
  • _ arm은 최대 한 번만 사용할 수 있습니다.
  • _ arm이 없어도 문법상 허용됩니다. (일치 arm이 없으면 아무 arm도 실행되지 않음)

주의 사항

  1. 중복 케이스 금지
  • 같은 케이스를 중복 선언하면 컴파일 오류가 발생합니다.
  1. _ 중복 금지
  • _ arm을 두 번 이상 선언할 수 없습니다.
  1. arm 블록 필수
  • => 뒤에는 반드시 { ... } 블록을 써야 합니다.
  1. 패턴은 상수여야 함
  • 식별자 패턴은 정수 상수/enum variant로 해석 가능한 값만 사용하세요.

요약

Wave의 match는 정수/enum 분기에 최적화된 statement 제어문입니다. => + 블록 구조를 사용하며, 와일드카드(_)를 통해 기본 분기를 구성할 수 있습니다.

분기 케이스가 많아질수록 if / else if보다 읽기 쉽고, 의도를 명확히 드러낼 수 있습니다.