Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

オーバーロード

マクロは、さまざまな引数の組み合わせを受け取れるようにオーバーロードできます。 その点で、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);
}