Краткое сопоставление шаблонов в Rust с использованием let-else

Beginner

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

Введение

В этом лабе демонстрируется использование let-else в Rust, где разрешающий шаблон может сопоставить и связать переменные в окружающей области видимости, или же расходиться, если шаблон не соответствует, с использованием инструкций, таких как break, return или panic!. Эта конструкция позволяет писать краткий и читаемый код при работе с сценариями сопоставления шаблонов и обработки ошибок, устраняя необходимость повторения блоков кода или использования внешних инструкций let.

Примечание: Если в лабе не указано имя файла, вы можете использовать любое имя файла, которое хотите. Например, вы можете использовать main.rs, скомпилировать и запустить его с помощью rustc main.rs &&./main.

let-else

С использованием 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!("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, чтобы улучшить свои навыки.