At most one repetition
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); )? } } #}