Macros Basics
10 examples to get you started with Macros - 7 basic and 3 intermediate.
Busca en todas las páginas de la documentación
10 examples to get you started with Macros - 7 basic and 3 intermediate.
// declarative: macro_rules!
macro_rules! say_hello {
() => { println!("Hello"); };
}
// procedural: #[derive(Serialize)] implemented by proc macro crateRelated: macro_rules!
macro_rules! greet {
($name:expr) => {
println!("Hello, {}", $name);
};
}
fn main() {
greet!("Rust");
}$name:expr captures an expressioncargo expand to debug outputMacros do not accidentally capture local variables from caller (hygienic for macro_rules!).
macro_rules! double {
($x:expr) => { $x * 2 };
}
fn demo() {
let x = 10;
assert_eq!(double!(5), 10); // uses 5, not local x
}Related: Debugging Macros
println!("debug = {:?}", dbg!(value));
todo!();
unreachable!();format!, vec!, panic! are macrosinclude_str!, env! compile-time embedcfg! and concat! for conditional build// Prefer generic function:
fn max<T: Ord>(a: T, b: T) -> T {
if a > b { a } else { b }
}Related: Macros Best Practices
macro_rules! id {
($x:ident) => { stringify!($x) };
}Common specifiers: expr, ident, ty, path, stmt, block, tt.
macro_rules! vec_str {
($($x:expr),*) => {
vec![$($x.to_string()),*]
};
}$()* repeats pattern$(,)* optional comma separationvec! and similar APIsRelated: macro_rules!
#[derive(Debug, Clone, serde::Serialize)]
struct User { id: u64 }syn + quote parse and generate codeRelated: Derive Macros
#[tokio::main]
async fn main() { }Related: Attribute Macros
cargo install cargo-expand
cargo expand -p mycrate my_fntrace_macros! (unstable) sparinglyRelated: Debugging Macros
Stack versions: This page was written for Rust 1.97.0 (edition 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, and Polars 0.46+.
Revisado por Chris St. John·Última actualización: 19 jul 2026