Macro Rules
Macro Repetition
Capture a List
A macro repetition can accept a comma-separated list and expand that list into another expression.
Program
Play the program to choose the middle word in a repeated macro input.
macro_repetition_words.rs
Replay: real traced execution (multi-file project)
macro_rules! collect_words {
($($word:expr),+ $(,)?) => {{
let values = vec![$($word),+];
values.join(",")
}};
}
fn main() {
let extra = "green";
let joined = collect_words!("red", extra, "blue");
println!("{joined}");
}
macro_rules! collect_words {
($($word:expr),+ $(,)?) => {{
let values = vec![$($word),+];
values.join(",")
}};
}
fn main() {
let extra = "gold";
let joined = collect_words!("red", extra, "blue");
println!("{joined}");
}
macro_rules! collect_words {
($($word:expr),+ $(,)?) => {{
let values = vec![$($word),+];
values.join(",")
}};
}
fn main() {
let extra = "gray";
let joined = collect_words!("red", extra, "blue");
println!("{joined}");
}
extra ← "green", joined ← "red,green,blue"
8fn main() {9 let extr→ "green"a = "green"; //@extra="green", "gold", "gray"10 let joine→ "red,green,blue"d = collect_words!("red", extra, "blue");11 println!("{joined}");12}outputred,green,blue
extra ← "gold", joined ← "red,gold,blue"
8fn main() {9 let extr→ "gold"a = "gold";10 let joine→ "red,gold,blue"d = collect_words!("red", extra, "blue");11 println!("{joined}");12}outputred,gold,blue
extra ← "gray", joined ← "red,gray,blue"
8fn main() {9 let extr→ "gray"a = "gray";10 let joine→ "red,gray,blue"d = collect_words!("red", extra, "blue");11 println!("{joined}");12}outputred,gray,blue
repetition
`$($word:expr),+` captures one or more comma-separated expressions.
optional trailing comma
`$(,)?` accepts a final comma without requiring one.
expansion list
`$($word),+` repeats the captured expressions inside `vec!`.