識別子
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リファレンスを読んでください。