可変個引数によるインターフェース

_可変個引数の_インターフェースとは、任意の数の引数を取るものです。例えば、println!は、フォーマット文字列の定義に従い、任意の数の引数を取ることができます。

前のセクションのcalculate!マクロを、可変個引数に拡張することができます:

macro_rules! calculate {
    // 単一の`eval`のためのパターン
    (eval $e:expr) => {
        {
            let val: usize = $e; // 強制的に型を整数にします。
            println!("{} = {}", stringify!{$e}, val);
        }
    };

    // 複数の`eval`を再帰的に分解します。
    (eval $e:expr, $(eval $es:expr),+) => {{
        calculate! { eval $e }
        calculate! { $(eval $es),+ }
    }};
}

fn main() {
    calculate! { // ほら!可変な`calculate!`だよ!
        eval 1 + 2,
        eval 3 + 4,
        eval (2 * 3) + 1
    }
}

出力はこうなります:

1 + 2 = 3
3 + 4 = 7
(2 * 3) + 1 = 7