Sobrecargar

Los macros se pueden sobrecargar para aceptar diferentes combinaciones de argumentos. En ese sentido, macro_rules! Puede funcionar de manera similar a un bloque de coincidencia:

// `test!` comparará `$izquierda` y `$derecha`
// de diferentes formas dependiendo de cómo lo invoques:
macro_rules! test {
    // Los argumentos no necesitan estar separados por una coma.
    // ¡Se puede utilizar cualquier plantilla!
    ($izquierda:expr; and $derecha:expr) => {
        println!("{:?} y {:?} es {:?}",
                 stringify!($izquierda),
                 stringify!($derecha),
                 $izquierda && $derecha)
    };
    // ^ cada brazo debe terminar con un punto y coma.
    ($izquierda:expr; or $derecha:expr) => {
        println!("{:?} o {:?} es {:?}",
                 stringify!($izquierda),
                 stringify!($derecha),
                 $izquierda || $derecha)
    };
}

fn main() {
    test!(1i32 + 1 == 2i32; and 2i32 * 2 == 4i32);
    test!(true; or false);
}