At most one repetition - The Edition Guide

# 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.

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