識別子
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 }); }
使用できる識別子には以下のようなものがあります。
block
expr
式に使用。ident
関数、変数の名前に使用。item
literal
はリテラル定数。pat
(パターン)path
stmt
(宣言)tt
(トークンツリー)ty
(型)vis
(可視性修飾子)(訳注:pub (crate)
とか)
完全なリストを見るには、Rustリファレンスを読んでください。