Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

let-else

🛈 안정화 버전: rust 1.65

🛈 다음과 같이 컴파일하여 특정 에디션을 타겟팅할 수 있습니다: rustc --edition=2021 main.rs

let-else를 사용하면, 일반적인 let처럼 주변 스코프에서 변수를 매칭하고 바인딩할 수 있으며, 패턴이 매칭되지 않을 경우 분기(예: break, return, panic!)할 수 있습니다.

use std::str::FromStr;

fn get_count_item(s: &str) -> (u64, &str) {
    let mut it = s.split(' ');
    let (Some(count_str), Some(item)) = (it.next(), it.next()) else {
        panic!("카운트 아이템 쌍을 분리할 수 없습니다: '{s}'");
    };
    let Ok(count) = u64::from_str(count_str) else {
        panic!("정수를 파싱할 수 없습니다: '{count_str}'");
    };
    (count, item)
}

fn main() {
    assert_eq!(get_count_item("3 chairs"), (3, "chairs"));
}

이름 바인딩의 스코프는 이것이 matchif let-else 표현식과 다른 주요 점입니다. 이전에는 외부 let과 약간의 반복을 통해 이러한 패턴을 흉내 낼 수 있었습니다:

#![allow(unused)]
fn main() {
use std::str::FromStr;

fn get_count_item(s: &str) -> (u64, &str) {
    let mut it = s.split(' ');
    let (count_str, item) = match (it.next(), it.next()) {
        (Some(count_str), Some(item)) => (count_str, item),
        _ => panic!("카운트 아이템 쌍을 분리할 수 없습니다: '{s}'"),
    };
    let count = if let Ok(count) = u64::from_str(count_str) {
        count
    } else {
        panic!("정수를 파싱할 수 없습니다: '{count_str}'");
    };
    (count, item)
}

assert_eq!(get_count_item("3 chairs"), (3, "chairs"));
}

참고:

option, match, if let 그리고 let-else RFC.