問題一覧に戻る
上級マクロ
問題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);
}