Programación metaprogramada en Rust con macros

Beginner

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

Introducción

En este laboratorio, exploraremos el poderoso sistema de macros que ofrece Rust, que permite la metaprogramación mediante la expansión de macros en árboles de sintaxis abstracta. La macro macro_rules! se utiliza para crear macros, y se distinguen de las funciones por su terminación con un signo de exclamación !. Las macros son útiles para evitar la repetición de código, crear lenguajes de dominio específicos y definir interfaces variádicas para funciones que pueden tomar un número variable 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.

macro_rules!

Rust ofrece un sistema de macros poderoso que permite la metaprogramación. Como has visto en los capítulos anteriores, las macros se parecen a funciones, excepto que su nombre termina con un signo de exclamación !, pero en lugar de generar una llamada a función, las macros se expanden en código fuente que se compila con el resto del programa. Sin embargo, a diferencia de las macros en C y otros lenguajes, las macros de Rust se expanden en árboles de sintaxis abstracta, en lugar de un preprocesamiento de cadenas, por lo que no tendrás errores de precedencia inesperados.

Las macros se crean utilizando la macro macro_rules!.

// Esta es una macro simple llamada `say_hello`.
macro_rules! say_hello {
    // `()` indica que la macro no toma argumentos.
    () => {
        // La macro se expandirá en el contenido de este bloque.
        println!("Hello!")
    };
}

fn main() {
    // Esta llamada se expandirá en `println!("Hello")`
    say_hello!()
}

Entonces, ¿por qué son útiles las macros?

  1. No te repitas. Hay muchos casos en los que puede que necesites una funcionalidad similar en varios lugares pero con diferentes tipos. Con frecuencia, escribir una macro es una forma útil de evitar la repetición de código. (Más sobre esto más adelante)

  2. Lenguajes de dominio específicos. Las macros te permiten definir una sintaxis especial con un propósito específico. (Más sobre esto más adelante)

  3. Interfaces variádicas. A veces quieres definir una interfaz que tome un número variable de argumentos. Un ejemplo es println! que podría tomar cualquier número de argumentos, dependiendo de la cadena de formato. (Más sobre esto más adelante)

Resumen

¡Felicidades! Has completado el laboratorio Macro_rules! Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.