Macros declarativas (`macro_rules!`)
Aprenda a escribir macros declarativas para abstraer patrones de código repetitivos y generar código durante la compilación.
Macros declarativas (`macro_rules!`) es una lección gratuita de Learn Rust Coding en CoddyKit. Esta es la lección 1 de 3. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Learn Rust Coding, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Learn Rust Coding incluye 3 lecciones en total.
¿Qué son las macros de Rust?
¡Las macros permiten escribir código que escribe código! Son similares a las funciones, pero operan sobre árboles sintácticos (la estructura de su código) en lugar de valores.
- Ayudan a abstraer código repetitivo.
- Permiten crear lenguajes específicos de dominio (DSL) dentro de Rust.
- Se ejecutan en tiempo de compilación y se expanden a código Rust normal antes de la compilación.
Sintaxis de las macros declarativas
Las macros declarativas de Rust usan la palabra clave macro_rules!. Definen un conjunto de reglas que coinciden con patrones específicos de código Rust.
Considérelas como una coincidencia de patrones aplicada al código. Cuando el compilador encuentra una invocación de macro, intenta hacer coincidir la entrada con una de las reglas que ha definido.
Su primer `macro_rules!`
Vamos a crear una macro muy sencilla que imprima un saludo. Observe la palabra clave macro_rules! y la sintaxis () => {}, que define una regla sin patrón de entrada.
Pruebe a ejecutar este ejemplo:
macro_rules! greet {
() => {
println!("Hello from a macro!");
};
}
fn main() {
greet!(); // Call our macro!
}Capturar entradas con designadores
Las macros pueden recibir entradas mediante «designadores». Estos indican a la macro qué tipo de sintaxis de Rust debe esperar capturar.
$expr: una expresión (por ejemplo,1 + 2,"hello")$ident: un identificador (por ejemplo, el nombre de una variable o función)$ty: un tipo (por ejemplo,i32,String)$block: un bloque de código (por ejemplo,{ ... })- ...¡y muchos más!
Macros que reciben argumentos
Aquí tiene una macro que recibe una expresión ($e:expr) e imprime su valor. :expr es el designador.
El $e capturado queda disponible para usarlo en el cuerpo de la macro. La macro stringify! convierte la expresión en su representación como cadena.
macro_rules! debug_print {
($e:expr) => {
println!("Debug: {} = {:?}", stringify!($e), $e);
};
}
fn main() {
let x = 10;
debug_print!(x + 5);
debug_print!("Rust macros are fun");
}Gestionar varias entradas
¿Qué ocurre si quiere que una macro reciba varios argumentos del mismo tipo? Puede usar operadores de repetición: $()*.
$(): el contenido interno es el patrón que se repetirá.*: cero o más repeticiones.+: una o más repeticiones.- También puede especificar un separador, como
$(...),*para elementos separados por comas.
Macro con argumentos repetitivos
Vamos a crear una macro que reciba varias expresiones separadas por comas e imprima cada una individualmente. Esto resulta muy útil para crear estructuras similares a listas.
macro_rules! print_all {
( $( $x:expr ),* ) => {
$( // This $(...)* repeats the `println!` call
println!("Item: {:?}", $x);
)*
};
}
fn main() {
print_all!(1, "hello", true, 3.14);
print_all!("Just one item");
}Comprender la higiene de las macros
Las macros de Rust son «higiénicas». Esto significa que las variables definidas dentro de una macro no entrarán en conflicto accidentalmente con las variables externas, aunque tengan el mismo nombre.
Durante la expansión, el compilador cambia internamente los nombres para evitar efectos secundarios no deseados, lo que hace que las macros sean más seguras y previsibles.
Cómo depurar macros
A veces las macros no se expanden como espera. Rust ofrece una forma de ver el código expandido:
- Ejecute
cargo expand(requiere instalar la herramientacargo-expand). - Use directamente
rustc --pretty expandeden el archivo de código fuente.
Esto muestra el código Rust sin procesar que genera su macro, lo que resulta invaluable para depurar y comprender el comportamiento de macros complejas.
Cuestionario sobre coincidencia de patrones de macros
Considere la siguiente definición de macro:
macro_rules! make_tuple {
( $x:expr, $y:expr ) => {
($x, $y)
};
}¿Cuál de las siguientes líneas se compilaría correctamente y usaría la macro make_tuple!?
Repaso: macros declarativas
En esta lección, ha aprendido sobre las macros declarativas que usan macro_rules!:
- Generan código en tiempo de compilación y abstraen patrones repetitivos.
- Usan coincidencia de patrones para capturar entradas según su sintaxis.
- Los designadores como
$expry$identespecifican qué tipo de sintaxis se espera. - Los operadores de repetición como
$()*gestionan varios argumentos con separadores flexibles. - Las macros son higiénicas, lo que evita conflictos accidentales entre nombres.
¡Las macros son una herramienta muy potente para reducir el código repetitivo y crear API flexibles y ergonómicas en Rust!
Preguntas frecuentes
¿La lección «Macros declarativas (`macro_rules!`)» es gratis?
Sí — el texto completo de «Macros declarativas (`macro_rules!`)» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Learn Rust Coding, actualiza a CoddyKit PRO. El curso de Learn Rust Coding incluye 3 lecciones en total.
¿Qué aprenderé en «Macros declarativas (`macro_rules!`)»?
Aprenda a escribir macros declarativas para abstraer patrones de código repetitivos y generar código durante la compilación. Practicas Learn Rust Coding con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Learn Rust Coding?
No se requiere experiencia previa. Learn Rust Coding en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 3.
¿Cuánto tiempo toma la lección «Macros declarativas (`macro_rules!`)»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Learn Rust Coding?
Sí. Cada lección de Learn Rust Coding incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Macros declarativas (`macro_rules!`)
- Macros procedurales: Derive y Function
- Interacción con Rust no seguro