可変長引数

可変長引数は様々な数の引数をとります。例えば、println!は、フォーマット文字列 に従って、いろいろな数の引数をとります。

前の章のcalculate!マクロを拡張してみましょう。

macro_rules! calculate {
    // `eval`がひとつだけの場合
    (eval $e:expr) => {{
        {
            let val: usize = $e; // Force types to be integers
            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