15.2 Overload
매크로는 오버로드 되어 다양한 인자 조합을 허용할 수 있다. 그 점에서, macro_rules!는 match 블록과 유사하게 동작한다.
// `test!`는 `$left`와 `$right`를 비교할 것이다.
// 당신이 어떻게 호출할 지에 따라 다른 방법으로:
macro_rules! test {
// 인자들은 쉼표로 구분될 필요가 없다.
// 모든 형태가 사용될 수 있다!
($left:expr; and $right:expr) => (
println!("{:?} and {:?} is {:?}",
stringify!($left),
stringify!($right),
$left && $right)
);
// ^ 각 문장은 반드시 세미콜론으로 끝나야만 한다.
($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);
}