問題一覧に戻る
上級マクロ
問題106: 宣言的マクロ基礎
macro_rules!はコンパイル時にコードを生成する宣言的マクロを定義します。パターンマッチングによる柔軟な構文変換が可能。$で始まるメタ変数でパラメータを受け取り、:identは識別子、:exprは式などの型を指定。$()*は繰り返しパターンで可変長引数を処理。DRY原則に従い、ボイラープレートコードを削減します。Vec!やprintln!など標準ライブラリでも広く使用される強力な機能です。
// シンプルなマクロ
macro_rules! say_hello {
() => {
println!("Hello!");
};
}
// パラメータ付きマクロ
macro_rules! create_function {
($func_name:) => {
fn $func_name() {
println!("Called {}", stringify!());
}
};
}
// パターンマッチングマクロ
macro_rules! vec_macro {
( $( $x:expr ),* ) => {
{
let mut temp_vec = Vec::new();
$(
temp_vec.($x);
)*
temp_vec
}
};
}
fn main() {
!();
create_function!(foo);
foo();
let v = vec_macro![1, 2, 3];
println!("{:?}", v);
}