Rust let-else 패턴 매칭 간결하게 활용하기

Beginner

This tutorial is from open-source community. Access the source code

소개

이 실습에서는 Rust 에서 let-else의 사용법을 보여줍니다. let-else는 반증 가능한 패턴 (refutable pattern) 을 통해 주변 범위의 변수를 일치시키고 바인딩하거나, 패턴과 일치하지 않을 경우 break, return, 또는 panic!와 같은 문을 사용하여 분기 (diverge) 합니다. 이 구조는 패턴 일치 및 오류 처리 시나리오에서 코드를 간결하고 읽기 쉽게 만들어, 코드 블록을 반복하거나 외부 let 문을 사용할 필요성을 제거합니다.

참고: 실습에서 파일 이름을 지정하지 않으면 원하는 파일 이름을 사용할 수 있습니다. 예를 들어 main.rs를 사용하고 rustc main.rs && ./main으로 컴파일 및 실행할 수 있습니다.

let-else

let-else를 사용하면 반증 가능한 패턴 (refutable pattern) 이 일반적인 let처럼 주변 범위의 변수와 일치하고 바인딩할 수 있습니다. 패턴과 일치하지 않으면 (예: break, return, panic!) 분기 (diverge) 합니다.

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!("Can't segment count item pair: '{s}'");
    };
    let Ok(count) = u64::from_str(count_str) else {
        panic!("Can't parse integer: '{count_str}'");
    };
    (count, item)
}

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

이 구문의 주요 차이점은 이름 바인딩의 범위입니다. 이전에는 match 또는 if let-else 표현식으로 이와 유사한 패턴을 구현하려면 불필요한 반복과 외부 let 문을 사용해야 했습니다.

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!("Can't segment count item pair: '{s}'"),
    };
    let count = if let Ok(count) = u64::from_str(count_str) {
        count
    } else {
        panic!("Can't parse integer: '{count_str}'");
    };
        (count, item)
    }

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

요약

축하합니다! Let-Else 실습을 완료했습니다. LabEx 에서 더 많은 실습을 통해 기술을 향상시킬 수 있습니다.