Rust

【Rust】第1章第5回:列挙型(Enum)とパターンマッチングの活用方法

本記事では、Rustにおける列挙型(Enum)の基本概念と、パターンマッチングを活用する方法について詳しく解説します。これらの機能を理解することで、より表現力豊かなコードを書くことが可能になります。

0. 記事の概要

この記事を読むメリット

  • Rustの列挙型の基本を理解: Enumの定義と用途を学べます。
  • パターンマッチングの活用方法を習得: match構文を使った効率的なコードの書き方を学べます。
  • エラーハンドリングへの応用: Option型やResult型を用いた安全なプログラミングを学べます。

この記事で学べること

  • RustのEnumの基本構文
  • match文を使った条件分岐
  • Option型とResult型の活用方法

1. RustのEnumとは?

1.1 Enumの基本構文

Rustでは、列挙型(Enum)を使用して複数の状態を持つデータを表現できます。

enum Color {
    Red,
    Green,
    Blue,
}

fn main() {
    let color = Color::Red;
}

動作解説

このコードでは、Colorという列挙型を定義し、それを使用して変数colorを宣言しています。

1.2 Enumの値を取得

Enumの値を取得し、それに応じた処理を行うにはmatch文を使用します。

fn print_color(color: Color) {
    match color {
        Color::Red => println!("赤です"),
        Color::Green => println!("緑です"),
        Color::Blue => println!("青です"),
    }
}

動作解説

matchを使用して、Enumの値に応じた異なる処理を行っています。

2. match構文の活用

2.1 match文の基本

match文は、Enumの値を判別し、適切な処理を実行するための強力なツールです。

2.2 match文の使用例

fn main() {
    let number = 3;
    match number {
        1 => println!("One"),
        2 => println!("Two"),
        3 => println!("Three"),
        _ => println!("Other"),
    }
}

動作解説

_はワイルドカードで、それ以外の値が入力された場合の処理を定義できます。

3. Option型とResult型の活用

3.1 Option型とは?

Rustでは、nullを使わずに値の有無を表すためにOption型を使用します。

fn find_value(x: i32) -> Option {
    if x > 0 {
        Some(x * 2)
    } else {
        None
    }
}

動作解説

この関数は、xが0より大きい場合はSomeを返し、それ以外はNoneを返します。

3.2 Result型とは?

エラーハンドリングにはResult型を使用します。

fn divide(a: i32, b: i32) -> Result {
    if b == 0 {
        Err(String::from("ゼロ除算エラー"))
    } else {
        Ok(a / b)
    }
}

動作解説

Result型を使うことで、成功時はOkを返し、エラー時はErrを返します。

4. よくあるエラーと対処法

  • 「non-exhaustive patterns」エラー: match文ですべてのパターンを網羅していない場合に発生。ワイルドカード(_)を追加する。
  • 「mismatched types」エラー: OptionやResultの型を正しく処理していない場合に発生。unwrap()matchを使用する。

5. まとめ

本記事では、RustのEnumの基本、match構文の使い方、Option型とResult型の活用方法について解説しました。次回は、Rustの条件分岐(if文とmatch式)について詳しく説明します。