こちらの記事は Rustマクロ冬期講習アドベントカレンダー 17日目の記事です!
属性風マクロはRustの手続きマクロの一種です。では作っていきます。
最小構成の属性風マクロ
ライブラリクレートを作成します。
cargo new --lib attr_macro
cd attr_macro
Cargo.toml
を書き換えます。
Cargo.toml
[package]
name = "attr_macro"
version = "0.1.0"
edition = "2021"
+[lib]
+proc-macro = true
[dependencies]
src/lib.rs
を書き換えます。関数風マクロの時と同様入力をそのまま出力してしまうことにします!
src/lib.rs
use proc_macro::TokenStream as S;
#[proc_macro_attribute]
pub fn a(_attr: S, item: S) -> S {
item
}
動作確認します。
src/main.rs
use attr_macro::a;
#[a]
fn main() {
println!("Hello, world!");
}
cargo run
無事にコンパイルされたところでタイマーストップ。
まとめ・所感
記録は2分22秒ほどでした。マクロの引数について、開始前にメタとアイテムどちらが先に来るか確認しておくべきでしたね...deriveマクロではもう少し早い記録を狙いたいです!でわ