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

if let, let else, while let

~10 min · enums, if-let, let-else, while-let

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

match 는 망라적인데, 강력하지만 정확히 한 패턴에만 관심 있을 땐 장황해. let 계열 구문들이 그 흔한 경우의 ergonomic 단축이야.

if let — 한 패턴, 나머지 무시

if let Some(x) = opt { ... } 는 패턴이 맞을 때만 블록을 돌리고, 안에서 쓰게 x 를 바인딩해. 나머지는 다 조용히 건너뛰어. 안 맞는 경우엔 else 를 더할 수 있고. 정확히 진짜 arm 하나랑 _ => {} 있는 match 인데, 의식 없이.

let else — 매칭하거나 빠져나가기

let Some(x) = opt else { return; }; 는 패턴이 맞으면 x 를 바인딩하고, 아니면 else 블록을 돌리는데 그게 반드시 diverge 해야 해 (return, break, panic). 이 줄 뒤로 x 가 함수 나머지에서 쓸 수 있어 — 중첩 없이. 함수 맨 위에서 '이게 없으면 여기서 멈춰' 를 처리하는 깔끔한 방법이야.

let else 가 happy path 를 평평하게 해. 함수 본문 전체를 if let { ... } 으로 감싸는 대신, let ... else { return } 으로 나쁜 경우를 일찍 처리하고 메인 로직을 안 들여쓰게 둬. early-return 가드 절에 대한 Rust 의 답이야.

while let — 패턴이 실패할 때까지 루프

while let Some(x) = iter.next() { ... } 는 패턴이 맞는 동안 계속 루프하고, None 을 받는 순간 멈춰. 스택을 비우거나, 이터레이터를 수동으로 소비하거나, 큐를 빌 때까지 처리하는 자연스러운 방법이야.

Code

if let, let else, while let·rust
fn main() {
    let config: Option<i32> = Some(42);

    // if let: Some 에만 작동, None 무시
    if let Some(v) = config {
        println!("configured: {v}");
    }

    // let else: 바인딩하거나 빠져나가기 (else 는 반드시 diverge)
    let Some(v) = config else {
        println!("no config");
        return;
    };
    println!("using {v}"); // v 가 스코프에 있음, 중첩 없음

    // while let: 패턴이 매칭 멈출 때까지 루프
    let mut stack = vec![1, 2, 3];
    while let Some(top) = stack.pop() {
        println!("popped {top}");
    }
}

External links

Exercise

Option<String> 설정을 받는 함수를 가져와봐. 중첩 if let 으로 한 번 쓰고, 그다음 let ... else { return } 으로 다시 써서 happy path 가 안 들여쓰여지게. 함수가 30줄로 자라면 어느 버전이 읽기 쉬워?
Hint
let else 는 부재 경우를 맨 위에서 처리하고 함수 나머지를 평평하게 돌게 해. 중첩 if let 은 optional 값마다 메인 로직을 한 단계씩 더 깊이 밀어 — 금방 쌓여.

Progress

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

댓글 0

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

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