Rust 速習チュートリアル

Rust の列挙型

1. 列挙型 (Enums)

列挙型(Enums / Enumerationの略)は、いくつかの異なる値のうちの1つを取ることができる型を定義するための手法です。 列挙型に含まれるそれぞれの値は、「バリアント(Variant)」と呼ばれます。

列挙型は、曜日、方向(上下左右)、あるいは「成功」と「エラー」といった、あらかじめ決められた選択肢のセットを表現したい場合に非常に便利です。

2. Enumの作成

列挙型を作成するには、enum キーワードを使用し、カンマで区切られた名前付きの値(バリアント)を追加します。

サンプルコード

enum Direction {
  Up,
  Down,
  Left,
  Right,
}

この列挙型を使用するには、変数を作成し、列挙型のバリアントの1つを割り当てます(バリアントにアクセスするには :: を使用します)。

サンプルコード

enum Direction {
  Up,
  Down,
  Left,
  Right,
}

fn main() {
  let my_direction = Direction::Up;
  println!("上に進んでいます!");
}

3. Enum値に対するmatch

列挙型は match 文と非常に相性が良く、使用されているバリアントに応じて異なるコードを実行させることができます。

サンプルコード

enum Direction {
  Up,
  Down,
  Left,
  Right,
}

fn main() {
  let my_direction = Direction::Left;

  match my_direction {
    Direction::Up => println!("上に移動中"),
    Direction::Down => println!("下に移動中"),
    Direction::Left => println!("左に移動中"),
    Direction::Right => println!("右に移動中"),
  }
}

4. データを保持するEnum

Rustの列挙型のバリアントには、データを持たせることも可能です。これは、各バリアントに追加の情報を保存する必要がある場合に非常に強力な機能となります。

サンプルコード

enum LoginStatus {
  Success(String), // 成功メッセージを保持
  Error(String),   // エラー内容を保持
}

fn main() {
  let result1 = LoginStatus::Success(String::from("ようこそ、Johnさん!"));
  let result2 = LoginStatus::Error(String::from("パスワードが正しくありません"));

  match result1 {
    LoginStatus::Success(message) => println!("成功: {}", message),
    LoginStatus::Error(message) => println!("エラー: {}", message),
  }
}

5. Enumを使用する理由

プロフェッショナルな開発において、列挙型が選ばれる主な理由は以下の通りです。

  • 関連する値の型定義: 関連する複数の選択肢を1つの型としてグループ化できるため
  • 可読性と安全性の向上: コードが意図を明確に伝え、不正な値の混入を防ぐ(型安全)ため
  • 網羅的なケース処理: match を使用することで、すべてのパターンを漏れなく処理できるため