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);
         )?
    }
}
#}