TL;DR

関数などプログラムの要素に付けて、その要素のトークン列を入力として受け取る Rust の手続き的マクロ。関数的マクロと同じく、任意のトークン列を返す。

仕組み

関数的マクロとは異なり、引数を 2 つ受け取る。1 つ目は属性に渡されたトークン列、2 つ目は属性が付けられた要素のトークン列である。返したトークン列は、属性が付けられた要素と置き換わる。

pub fn route(attr: TokenStream, item: TokenStream) -> TokenStream

定義するには、proc-macro = true を設定したクレートで、関数に #[proc_macro_attribute] 属性を付ける。引数の解析には syn クレートが役立つ。

例

関数に付ける場合は次のように書く。

#[log_invocation]
fn add_three(x: u32) -> u32 {
    x + 3
}

注意点

属性マクロは、#![...] の形の内部属性としては使えない。

関連

出典