マクロ指定子

マクロの引数は$で始まり、そのタイプは指定子で注釈します。

macro_rules! create_function {
    // このマクロは`ident`指定子の引数をとり、
    // `$func_name`という名前の関数を作ります。
    // The `ident` designator is used for variable/function names.
    ($func_name:ident) => {
        fn $func_name() {
            // `stringify!`マクロは`ident`を文字列に変換します。
            println!("You called {:?}()",
                     stringify!($func_name));
        }
    };
}

// 上のマクロを使って、`foo`と`bar`という関数を定義します。
create_function!(foo);
create_function!(bar);

macro_rules! print_result {
    // このマクロは式`$expression`をとり、それを文字列にしたものと
    // その結果を返します。`expr`指定子は式に対して指定します。
    ($expression:expr) => {
        // `stringify!`は式を*そのまま*文字列に変換します。
        println!("{:?} = {:?}",
                 stringify!($expression),
                 $expression);
    };
}

fn main() {
    foo();
    bar();

    print_result!(1u32 + 1);

    // ブロックも式です!
    print_result!({
        let x = 1u32;

        x * x + 2 * x - 1
    });
}

これらが利用可能な指定子の一例です。

  • block
  • exprは式に使います。
  • identは変数/関数名に使います。
  • item
  • literalはリテラルに使います
  • pat (パターン)
  • path
  • stmt ()
  • tt (トークン木)
  • ty ()
  • vis (可視性指定子(pubなど))

完全な一覧はRustリファレンスを参照してください。