質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

1回答

440閲覧

よく使うderiveを短く書く方法

mitiko

総合スコア2

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

1グッド

1クリップ

投稿2021/11/17 16:04

よく使うテンプレ的な#[derive(...)]を短く書く方法はないでしょうか?例えば,

rust

1#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)] 2struct User { ... }

rust

1#[derive(MyDerives)] 2struct User {... }

のように書けたらうれしいのですが.

sutonea👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

素直にはできそうもないですね。

思いつく方法は以下のとおりです。

  1. 宣言的マクロを使う
  2. 手続き的マクロの一種である「属性風マクロ」を使う
  3. エディターのコードスニペットや補完機能を使って楽に入力する

個人的なおすすめは最後の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と入力した時点でいくつかの入力候補が表示されます。

rust-analyzerによるコード補完

投稿2021/11/19 11:14

tatsuya6502

総合スコア2035

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mitiko

2021/11/20 18:59

2が理想的ですが,3が一番現実的ですね. 2についてはもう少し調べてみようと思います. ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問