Переменные интерфейсы в программировании на Rust

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

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

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

Введение

В этом лабораторном задании мы исследуем переменные интерфейсы, то есть интерфейсы, которые могут принимать произвольное количество аргументов. В качестве примера мы модифицируем макрос calculate! из предыдущего раздела, чтобы он был переменным, позволяя одновременно вычислять несколько выражений.

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") subgraph Lab Skills rust/variable_declarations -.-> lab-99230{{"Переменные интерфейсы в программировании на Rust"}} rust/function_syntax -.-> lab-99230{{"Переменные интерфейсы в программировании на Rust"}} rust/expressions_statements -.-> lab-99230{{"Переменные интерфейсы в программировании на Rust"}} end

Переменные интерфейсы

Переменный интерфейс принимает произвольное количество аргументов. Например, println! может принимать произвольное количество аргументов, определяемое строкой формата.

Мы можем расширить наш макрос calculate! из предыдущего раздела, чтобы он был переменным:

macro_rules! calculate {
    // Паттерн для одного `eval`
    (eval $e:expr) => {
        {
            let val: usize = $e; // Принудительно определяем типы как целые числа
            println!("{} = {}", stringify!{$e}, val);
        }
    };

    // Рекурсивно разбираем несколько `eval`
    (eval $e:expr, $(eval $es:expr),+) => {{
        calculate! { eval $e }
        calculate! { $(eval $es),+ }
    }};
}

fn main() {
    calculate! { // Смотрите, что я сделал! Переменный `calculate!`!
        eval 1 + 2,
        eval 3 + 4,
        eval (2 * 3) + 1
    }
}

Вывод:

1 + 2 = 3
3 + 4 = 7
(2 * 3) + 1 = 7

Резюме

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