指定子
マクロの引数にはドル記号 $ がプレフィックスとして付き、 指定子 による型注釈が付けられます:
macro_rules! create_function { // このマクロは指定子 `ident` の引数を取り、 // `$func_name` という名前の関数を作成します。 // `ident` 指定子は変数名/関数名に使用されます。 ($func_name:ident) => { fn $func_name() { // `stringify!` マクロは `ident` を文字列に変換します。 println!("あなたは {:?}() を呼び出しました", stringify!($func_name)); } }; } // 上記のマクロで `foo` と `bar` という名前の関数を作成します。 create_function!(foo); create_function!(bar); macro_rules! print_result { // このマクロは型 `expr` の式を取り、その結果とともに // 文字列として出力します。 // `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 }); }
利用可能な指定子の一部を次に示します:
blockexprは式に使用されますidentは変数名/関数名に使用されますitemliteralはリテラル定数に使用されますpat(パターン)pathstmt(文)tt(トークンツリー)ty(型)vis(可視性修飾子)
完全な一覧については、Rust Reference を参照してください。