C.W.K.
Stream
Lesson 05 of 06 · published

패턴의 여러 모양

~11 min · enums, patterns, destructuring, guards

Level 0Rust 호기심러
0 XP0/80 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete

패턴은 enum 전용이 아니야 — 데이터를 분해하는 언어 전역 미니 문법이야. 이미 let 이랑 match 에서 썼지; 여기 더 완전한 도구함이 있어.

구조분해

패턴은 데이터의 모양을 거울처럼 따라 조각을 꺼낼 수 있어: 튜플 (x, y), struct Point { x, y }, enum variant Some(n) 을 구조분해해. 패턴의 구조가 값의 구조에 맞고, 네가 쓴 이름들이 안쪽 조각들로의 바인딩이 돼.

와일드카드, 대안, 범위

_ 는 단일 값을 매칭하고 무시; .. 는 struct 나 튜플의 나머지를 무시해. or-패턴 1 | 2 | 3 은 한 arm 에서 여러 값 중 아무거나 매칭. 범위 패턴 1..=5 는 그 포함 범위 안 아무거나 매칭. 같이 쓰면 한 arm 이 if 사슬 없이 풍부한 조건을 표현해.

match 가드가 런타임 조건을 더해. 패턴 뒤의 ifSome(n) if n > 0 => ... — 는 패턴이 맞고 AND 가드가 참일 때만 arm 을 가져. 가드는 패턴이 모양만으로 표현 못 하는 조건을 표현하게 해.

@ 로 바인딩

@ 연산자는 값을 이름에 바인딩 하면서 동시에 패턴에 검사해: id @ 1..=9 => ...id 가 1–9 인지 확인하고 arm 에서 쓰게 id 로 바인딩해. '검사랑 값 둘 다 필요해' 의 도구야.

왜 중요하냐

Rust 는 다른 언어가 if-else 사슬에 기대는 만큼 패턴 매칭에 기대. 패턴을 마스터하는 게 관용적 Rust 를 깔끔하게 읽히게 만들어: 복잡한 경우 분석이 중첩 조건문 대신 평평하고 망라적인 match 가 돼.

Code

구조분해, 가드, or-패턴, 범위, @·rust
struct Point { x: i32, y: i32 }

fn classify(p: Point) -> &'static str {
    match p {
        Point { x: 0, y: 0 } => "origin",         // 정확한 구조분해
        Point { x, y: 0 } if x > 0 => "east axis", // 구조분해 + 가드
        Point { x: 0, .. } => "y axis",            // .. 가 나머지 무시
        _ => "elsewhere",
    }
}

fn main() {
    let n = 7;
    let label = match n {
        0 => "zero",
        1 | 2 | 3 => "small",        // or-패턴
        x @ 4..=9 => { let _ = x; "mid" }, // 범위 + @ 로 바인딩
        _ => "big",
    };
    println!("{} {}", classify(Point { x: 5, y: 0 }), label);
}

External links

Exercise

i32 점수에 대한 match 를 써봐, 이걸 써서: 정확한 값 몇 개에 or-패턴, 낙제용 범위 패턴 0..=59, 엣지 케이스용 가드, 정확한 낙제 점수를 바인딩해 보고하는 @. 각 arm 이 맞는 입력에 발동하는지 확인해.
Hint
조합해: s @ 0..=59 => format!("fail: {s}") 는 바인딩이랑 범위를 동시에; n if n == 100 같은 가드는 더 넓은 범위 arm 전에 만점을 잡아.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 똘이warm

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.