| # Overload |
| |
| Macros can be overloaded to accept different combinations of arguments. |
| In that regard, `macro_rules!` can work similarly to a match block: |
| |
| ```rust,editable |
| // `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); |
| } |
| ``` |