Overload
Macros can be overloaded to accept different combinations of arguments. In that regard, macro_rules!
can work similarly to a match block:
// `test!` will compare `$left` and `$right`// in different ways depending on how you invoke it:macro_rules! test {// Arguments don't need to be separated by a comma.// Any template can be used!($left:expr; and $right:expr) => {println!("{:?} and {:?} is {:?}",stringify!($left),stringify!($right),$left && $right)};// ^ each arm must end with a semicolon.($left:expr; or $right:expr) => {println!("{:?} or {:?} is {:?}",stringify!($left),stringify!($right),$left || $right)};}fn main() {test!(1i32 + 1 == 2i32; and 2i32 * 2 == 4i32);test!(true; or false);}