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