メタプログラミングとは、プログラム自身の構造を記述・検査・生成する仕組みです。


12.1 Attribute・Annotation・Decorator

コードにメタデータを付加します。

PHP:

#[Route('/users')]
public function index(): Response
{
}

Python:

@route("/users")
def index():
    pass

Java:

@GetMapping("/users")
public Response index() {
}

用途は共通しています。

ルーティング
バリデーション
シリアライズ
依存性注入
テスト設定
権限管理

ただし、仕組みは異なります。

単なるメタデータ
関数を変換する処理
コンパイル時コード生成
実行時Reflection

12.2 Reflection

実行中に型やメソッドの情報を調べる仕組みです。

クラス名を取得する
メソッド一覧を取得する
Attributeを読み取る
動的にインスタンスを生成する

柔軟ですが、静的解析が難しくなり、実行時エラーが増える場合があります。


12.3 マクロ

コードを生成・変換する仕組みです。

Rustには宣言的マクロと手続き的マクロがあります。

println!("hello");

println!は通常の関数ではなくマクロです。

マクロは次のような用途に使われます。

反復コードの削減
DSLの構築
コンパイル時検査
コード生成