【Rust】第4章第3回:列挙型(Enum)の定義とパターンマッチング

本記事では、Rustの列挙型(Enum)の定義方法と、match
を用いたパターンマッチングの活用方法について解説します。列挙型を適切に活用することで、より柔軟なデータ表現が可能になります。
0. 記事の概要
この記事を読むメリット
- Rustの列挙型の基本を理解: 状態を明確に表現できるようになります。
- パターンマッチングの活用:
match
やif let
を使って、簡潔に条件分岐を記述できます。 - コードの可読性向上: 意味のあるデータ構造を設計し、エラーを減らせます。
この記事で学べること
- Rustの列挙型の基本構文
- 列挙型の活用方法
- パターンマッチングの基本と応用
1. 列挙型(Enum)とは?

1.1 列挙型の基本構文
列挙型は、複数の関連する値を一つの型として定義するために使用されます。
enum TrafficLight {
Red,
Yellow,
Green,
}
fn main() {
let signal = TrafficLight::Red;
match signal {
TrafficLight::Red => println!("止まれ!"),
TrafficLight::Yellow => println!("注意!"),
TrafficLight::Green => println!("進め!"),
}
}
動作解説
TrafficLight
という列挙型を定義し、match
を用いて各状態に応じた処理を実装しています。
2. 列挙型の応用

2.1 列挙型に値を持たせる
列挙型の各バリアントに値を持たせることで、より多様なデータを扱えます。
enum Message {
Text(String),
Move { x: i32, y: i32 },
Quit,
}
fn main() {
let msg = Message::Text(String::from("Hello, Rust!"));
match msg {
Message::Text(text) => println!("メッセージ: {}", text),
Message::Move { x, y } => println!("移動: ({}, {})", x, y),
Message::Quit => println!("終了"),
}
}
動作解説
Message
列挙型には、文字列、座標、終了を表すバリアントがあり、それぞれ異なるデータを持つことができます。
3. if let を用いた簡潔なパターンマッチング

3.1 if letの活用
パターンマッチングを簡潔に記述するためにif let
を使用できます。
let msg = Message::Text(String::from("Rust is awesome!"));
if let Message::Text(text) = msg {
println!("メッセージ: {}", text);
}
動作解説
if let
を用いることで、特定のバリアントのみを処理する場合にmatch
よりも簡潔に記述できます。
4. よくあるエラーと対処法
- 「non-exhaustive patterns」エラー:
match
で全てのバリアントを網羅していない場合に発生。 - 「expected enum, found struct」エラー: 型の不一致がある場合に発生。
5. まとめ
本記事では、Rustの列挙型の定義とパターンマッチングについて解説しました。次回は、Option型とResult型を使ったエラーハンドリングについて詳しく学びます。