Sobrecarga de macros de Rust con macro_rules!

RustRustBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderá cómo se pueden sobrecargar macros en Rust utilizando la sintaxis macro_rules!, lo que permite que acepten diferentes combinaciones de argumentos.

Nota: Si el laboratorio no especifica un nombre de archivo, puede utilizar cualquier nombre de archivo que desee. Por ejemplo, puede utilizar main.rs, compilar y ejecutarlo con rustc main.rs &&./main.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/MemorySafetyandManagementGroup(["Memory Safety and Management"]) rust/DataTypesGroup -.-> rust/boolean_type("Boolean Type") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/MemorySafetyandManagementGroup -.-> rust/lifetime_specifiers("Lifetime Specifiers") subgraph Lab Skills rust/boolean_type -.-> lab-99226{{"Sobrecarga de macros de Rust con macro_rules!"}} rust/function_syntax -.-> lab-99226{{"Sobrecarga de macros de Rust con macro_rules!"}} rust/expressions_statements -.-> lab-99226{{"Sobrecarga de macros de Rust con macro_rules!"}} rust/lifetime_specifiers -.-> lab-99226{{"Sobrecarga de macros de Rust con macro_rules!"}} end

Sobrecarga

Las macros pueden ser sobrecargadas para aceptar diferentes combinaciones de argumentos. Al respecto, macro_rules! puede funcionar de manera similar a un bloque match:

// `test!` comparará `$left` y `$right`
// de diferentes maneras dependiendo de cómo se invoque:
macro_rules! test {
    // Los argumentos no necesitan estar separados por una coma.
    // ¡Se puede utilizar cualquier plantilla!
    ($left:expr; and $right:expr) => {
        println!("{:?} and {:?} is {:?}",
                 stringify!($left),
                 stringify!($right),
                 $left && $right)
    };
    // ^ cada brazo debe terminar con un punto y coma.
    ($left:expr; or $right:expr) => {
        println!("{:?} or {:?} is {:?}",
                 stringify!($left),
                 stringify!($right),
                 $left || $right)
    };
}

fn main() {
    test!(1i32 + 1 == 2i32; and 2i32 * 2 == 4i32);
    test!(true; or false);
}

Resumen

¡Felicitaciones! Has completado el laboratorio de Sobrecarga. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.