Macro Rules
Macro Expression
Expand to a Value
macro_rules! can expand a call into an expression that is checked after expansion.
Program
Play the program to choose an id and build a label through a small expression macro.
macro_expr_label.rs
Replay: real traced execution (multi-file project)
macro_rules! make_label {
($prefix:expr, $id:expr) => {
format!("{}-{}", $prefix, $id)
};
}
fn main() {
let id = 7;
let label = make_label!("task", id);
println!("{label}");
}
macro_rules! make_label {
($prefix:expr, $id:expr) => {
format!("{}-{}", $prefix, $id)
};
}
fn main() {
let id = 1;
let label = make_label!("task", id);
println!("{label}");
}
macro_rules! make_label {
($prefix:expr, $id:expr) => {
format!("{}-{}", $prefix, $id)
};
}
fn main() {
let id = 42;
let label = make_label!("task", id);
println!("{label}");
}
id ← 7, label ← "task-7"
7fn main() {8 let i→ 7d = 7; //@id=7, 1, 429 let labe→ "task-7"l = make_label!("task", id);10 println!("{label}");11}outputtask-7
id ← 1, label ← "task-1"
7fn main() {8 let i→ 1d = 1;9 let labe→ "task-1"l = make_label!("task", id);10 println!("{label}");11}outputtask-1
id ← 42, label ← "task-42"
7fn main() {8 let i→ 42d = 42;9 let labe→ "task-42"l = make_label!("task", id);10 println!("{label}");11}outputtask-42
macro_rules!
`macro_rules!` defines a declarative macro that rewrites syntax before type checking.
matcher
`$prefix:expr` and `$id:expr` capture expression fragments from the call site.
expansion
The macro expands to a `format!` expression that produces the final `String`.