오버로드
매크로는 서로 다른 인자 조합을 수용하도록 오버로딩될 수 있습니다. 그런 점에서는 macro_rules!는 match 블록과 비슷하게 작동할 수 있습니다:
// `test!`는 호출 방식에 따라 `$left`와 `$right`를
// 서로 다른 방식으로 비교할 것입니다:
macro_rules! test {
// 인자들은 콤마로 구분될 필요가 없습니다.
// 어떤 템플릿이든 사용될 수 있습니다!
($left:expr; and $right:expr) => {
println!("{:?} and {:?} is {:?}",
stringify!($left),
stringify!($right),
$left && $right)
};
// ^ 각 팔(arm)은 세미콜론으로 끝나야 합니다.
($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);
}