素直にはできそうもないですね。
思いつく方法は以下のとおりです。
- 宣言的マクロを使う
- 手続き的マクロの一種である「属性風マクロ」を使う
- エディターのコードスニペットや補完機能を使って楽に入力する
個人的なおすすめは最後の3.になります。
1. 宣言的マクロを使う
macro_rules!
で定義できる宣言的マクロを使います。たとえば以下のようにできます。
rust
1// 宣言的マクロ my_derives! を定義する
2macro_rules! my_derives {
3 // アイテム(structなどが該当)1つにマッチし、#[derive(..)] を追加する
4 ($item:item) => {
5 #[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
6 $item
7 };
8}
9
10// my_derives! マクロを使う
11my_derives! {
12 struct User {
13 name: String,
14 }
15}
16
17fn main() {
18 let u1 = User { name: "Alice".into() };
19 let u2 = User { name: "Bob".into() };
20 // DebugトレイトやPartialOrdトレイトが実装できていることを確認する
21 println!("{:?} < {:?}: {}", u1, u2, u1 < u2);
22 // → User { name: "Alice" } < User { name: "Bob" }: true
23}
2. 手続き的マクロの一種である「属性風マクロ」を使う
試していないので本当にできるかはわからないのですが、属性風マクロを使うと以下のように書けるかもしれません。
rust
1// 仮に、derive_setという属性風マクロを定義できたなら
2// このようにして使えるはず
3#[derive_set(MyDerives)]
4struct User {
5 name: String,
6}
これを以下のようなコードへと展開するように属性風マクロを定義します。
rust
1#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
2struct User {
3 name: String,
4}
手続き的マクロの実装方法については、以下を参照してください。
3. エディターのコードスニペットや補完機能を使って楽に入力する
コンパイラーに何かさせるのではなくて、エディターやIDEの入力サポート機能を使って、よく使うderive
の組み合わせを楽に入力できるようにします。
たとえばVisual Studio Codeとrust-analyzerを組み合わせると、#[derive()]
のカッコ内にPar
と入力した時点でいくつかの入力候補が表示されます。