メタプログラミングとは、プログラム自身の構造を記述・検査・生成する仕組みです。
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の構築
コンパイル時検査
コード生成