At most one repetition
for 2018 edition
for 2015 edition
In Rust 2018, we have made a couple of changes to the macros-by-example syntax.
- We have added a new Kleene operator
?
which means "at most one"repetition. This operator does not accept a separator token. - We have disallowed using
?
as a separator to remove ambiguity with?
.For example, consider the following Rust 2015 code:
#![allow(unused_variables)]
fn main() {
macro_rules! foo {
($a:ident, $b:expr) => {
println!("{}", $a);
println!("{}", $b);
};
($a:ident) => {
println!("{}", $a);
}
}
}
Macro foo
can be called with 1 or 2 arguments; the second one is optional,but you need a whole other matcher to represent this possibility. This isannoying if your matchers are long. In Rust 2018, one can simply write thefollowing:
#![allow(unused_variables)]
fn main() {
macro_rules! foo {
($a:ident $(, $b:expr)?) => {
println!("{}", $a);
$(
println!("{}", $b);
)?
}
}
}