Макросы с повторением в Rust

RustRustBeginner
Практиковаться сейчас

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабе вы узнаете, как использовать макросы с символами + и * в списке аргументов для указания повторения. В частности, пример, приведенный ниже, демонстрирует, как использовать $(...),+ для сопоставления одного или более выражений, разделенных запятыми. Макрос find_min! вычисляет минимальное значение среди переменного количества аргументов.

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/DataStructuresandEnumsGroup -.-> rust/method_syntax("Method Syntax") subgraph Lab Skills rust/function_syntax -.-> lab-99227{{"Макросы с повторением в Rust"}} rust/expressions_statements -.-> lab-99227{{"Макросы с повторением в Rust"}} rust/method_syntax -.-> lab-99227{{"Макросы с повторением в Rust"}} end

Повторение

Макросы могут использовать + в списке аргументов, чтобы указать, что аргумент может повторяться по крайней мере один раз, или *, чтобы указать, что аргумент может повторяться ноль или более раз.

В следующем примере обрамление сопоставителя $(...),+ будет соответствовать одному или более выражениям, разделенным запятыми. Также обратите внимание, что точка с запятой необязательна в последнем случае.

// `find_min!` будет вычислять минимум любого количества аргументов.
macro_rules! find_min {
    // Базовый случай:
    ($x:expr) => ($x);
    // `$x`, за которым следует по крайней мере один `$y,`
    ($x:expr, $($y:expr),+) => (
        // Вызов `find_min!` для хвоста `$y`
        std::cmp::min($x, find_min!($($y),+))
    )
}

fn main() {
    println!("{}", find_min!(1));
    println!("{}", find_min!(1 + 2, 2));
    println!("{}", find_min!(5, 2 * 3, 4));
}

Резюме

Поздравляем! Вы завершили лабу "Повторение". Вы можете практиковаться в более лабах в LabEx, чтобы улучшить свои навыки.