Rust

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

本記事では、Rustの列挙型(Enum)の定義方法と、matchを用いたパターンマッチングの活用方法について解説します。列挙型を適切に活用することで、より柔軟なデータ表現が可能になります。

0. 記事の概要

この記事を読むメリット

  • Rustの列挙型の基本を理解: 状態を明確に表現できるようになります。
  • パターンマッチングの活用: matchif 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型を使ったエラーハンドリングについて詳しく学びます。