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)] 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 is
annoying if your matchers are long. In Rust 2018, one can simply write the
following:
#![allow(unused)] fn main() { macro_rules! foo { ($a:ident $(, $b:expr)?) => { println!("{}", $a); $( println!("{}", $b); )? } } }