🎃
Rustの derive ってなに?
はじめに
Rustのコードの中でよく見かけるこの記述:
#[derive(Debug, Clone, PartialEq)]
最初は「これって何だろう?」とよくわかりませんでした。でも調べていくうちに、この derive がRustで便利な機能を簡単に使えるようにする魔法のようなものだと知って感動しました!
「deriveって何?」という方の参考になればうれしいです。
derive
とは
Rustにおける#[derive(...)]
は、構造体(struct)や列挙型(enum)に対して、標準的なトレイト(機能)を自動実装するための属性です。
例えば、下記のコードでは、Rustコンパイラに対して:
- Debug(デバッグ出力できるようにする)
- Clone(値を複製できるようにする)
- PartialEq(== で比較できるようにする)
という3つのトレイトを自動で実装してほしいと依頼しています。
#[derive(Debug, Clone, PartialEq)]
struct User {
name: String,
age: u32,
}
deriveでよく使うトレイト(機能)
トレイト名 | 機能説明 |
---|---|
Debug |
{:?} を使って構造体や列挙型の中身を出力できる |
Clone |
.clone() で値を複製できる |
PartialEq |
== や != で値の等価性を比較できる |
Eq |
PartialEq の強化版で完全な等価比較が可能 |
PartialOrd |
< や > などの大小比較ができる(部分順序) |
Ord |
ソートなどに使える完全な順序付き比較が可能 |
Hash |
HashMap や HashSet で使うために必要 |
Default |
.default() で構造体のデフォルト値を作れる |
✅ Debug:構造体の中身を表示できる
#[derive(Debug)]
struct User {
name: String,
age: u32,
}
fn main() {
let user = User { name: "Alice".into(), age: 30 };
println!("{:?}", user); // => User { name: "Alice", age: 30 }
}
✅ Clone:値をコピーできる
#[derive(Clone)]
struct User {
name: String,
age: u32,
}
fn main() {
let user1 = User { name: "Alice".into(), age: 30 };
let user2 = user1.clone(); // 所有権を移さずに複製できる
}
✅ PartialEq / Eq:値同士を比較できる(==)
#[derive(PartialEq, Eq)]
struct User {
id: u32,
}
fn main() {
let a = User { id: 1 };
let b = User { id: 1 };
println!("{}", a == b); // => true
}
✅ PartialOrd / Ord:大小比較できる、ソートも可能
#[derive(PartialOrd, Ord, PartialEq, Eq, Debug)]
struct Score {
value: i32,
}
fn main() {
let mut scores = vec![
Score { value: 80 },
Score { value: 95 },
Score { value: 70 },
];
scores.sort();
println!("{:?}", scores); // 昇順にソートされる
}
✅ Default:初期値を自動生成できる
#[derive(Default, Debug)]
struct Config {
debug_mode: bool,
max_retries: u32,
}
fn main() {
let config = Config::default(); // => Config { debug_mode: false, max_retries: 0 }
println!("{:?}", config);
}
メリット
- 面倒なコードを自動で生成してくれる(ボイラープレート削減)
- 型の比較、出力、コピーなどがすぐにできるようになる
- Rustの型システムと非常に相性が良い
🧠 まとめ
- derive はトレイトの自動実装指示であり、コードをシンプルに保つために使う。
- 多くの標準トレイト(Debug, Clone, PartialEq など)を自動で付与できる。
- より複雑な振る舞いが必要なときは、自分で impl することもできる。
✅ おわりに
ここまで、Rustの #[derive]
の基本と、よく使うトレイトについて見てきました。
-
Debug
やClone
を使うと、値を表示したり複製したりできる -
PartialEq
やOrd
を使うと、比較やソートも簡単に -
Default
を使えば、初期値もすぐ作れる
derive
はRustのトレイトのパワーを手軽に使うためのとても便利な仕組みなんですね。
まだまだRust初心者の私ですが、こうやってひとつずつ理解していくことで、少しずつRustの書き方が楽しくなってきました!
ここまで読んでくださってありがとうございました 🍀
Discussion