At most one repetition

Minimum Rust version: 1.32

In Rust 2018, we have made a couple of changes to the macros-by-example syntax.

  1. We have added a new Kleene operator ? which means "at most one" repetition. This operator does not accept a separator token.
  2. 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); )? } } #}