TL;DR

データ構造の定義(構造体と Enum)に付けて、生成したコードを追加する Rust の手続き的マクロ。

仕組み

入力は、#[derive(...)] を付けた構造体、Enum、union のトークン列である。返したトークン列は元の定義を置き換えず、同じモジュールの中で元の定義の後ろに追加される。定義するには、proc-macro = true を設定したクレートで、関数に #[proc_macro_derive] 属性を付ける。

#[proc_macro_derive(AnswerFn)]
pub fn derive_answer_fn(_item: TokenStream) -> TokenStream {
    "fn answer() -> u32 { 42 }".parse().unwrap()
}

#[proc_macro_derive(WithHelperAttr, attributes(helper))] のように attributes を指定すると、フィールドなどに付けるヘルパー属性も宣言できる。

注意点

使うときに気を付けることは Effective Rust 項目28 derive マクロを利用する上で注意すべきこと にまとめている。

関連

出典