識別子
macroの引数は$が頭につきます。型は 識別子 でアノテーションされます。
macro_rules! create_function { // このマクロは`ident`識別子に対応する値を引数として取り // `$func_name`という名の関数を作成します。 // `ident`識別子は関数・変数の名前用の識別子です。 ($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 { // このマクロは`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(可視性修飾子)(訳注:pub (crate)とか)
完全なリストを見るには、Rustリファレンスを読んでください。