Skip to content

第 12 章: エラーハンドリングと型安全性

12.1 はじめに

前章ではイテレータチェーンによるパイプライン処理を学びました。この最終章では、Rust の Result / Option 型 を使ったエラーハンドリングと enum による型安全性を学びます。

12.2 Result 型によるエラーハンドリング

Rust には例外(Exception)がありません。代わりに Result<T, E> 型を使います。

pub fn create(type_number: i32) -> Result<Box<dyn FizzBuzzType>, String> {
    match type_number {
        1 => Ok(Box::new(FizzBuzzType01)),
        2 => Ok(Box::new(FizzBuzzType02)),
        3 => Ok(Box::new(FizzBuzzType03)),
        _ => Err(format!("タイプ{}は見つかりません", type_number)),
    }
}

? 演算子によるエラー伝播

pub fn new(type_number: i32, number: i32) -> Result<Self, String> {
    let fizz_buzz_type = create(type_number)?;  // エラーなら早期リターン
    Ok(Self { fizz_buzz_type, number })
}

? 演算子は Go の if err != nil { return err } パターンを簡潔に表現するものです。

12.3 Option 型

値が存在しない可能性を表現する型です。Rust には null がありません。

pub fn find_first(&self, target: &str) -> Option<&FizzBuzzValue> {
    self.list.iter().find(|v| v.value() == target)
}

// 使用例
match list.find_first("Buzz") {
    Some(value) => println!("Found: {}", value),
    None => println!("Not found"),
}

12.4 enum による型安全な定数

FizzBuzzTypeName enum

#[derive(Debug, Clone, Copy, PartialEq)]
pub enum FizzBuzzTypeName {
    Standard = 1,
    NumberOnly = 2,
    FizzBuzzOnly = 3,
}

impl FizzBuzzTypeName {
    pub fn from_number(n: i32) -> Result<Self, String> {
        match n {
            1 => Ok(Self::Standard),
            2 => Ok(Self::NumberOnly),
            3 => Ok(Self::FizzBuzzOnly),
            _ => Err(format!("タイプ{}は見つかりません", n)),
        }
    }

    pub fn create_type(&self) -> Box<dyn FizzBuzzType> {
        match self {
            Self::Standard => Box::new(FizzBuzzType01),
            Self::NumberOnly => Box::new(FizzBuzzType02),
            Self::FizzBuzzOnly => Box::new(FizzBuzzType03),
        }
    }

    pub fn label(&self) -> &str {
        match self {
            Self::Standard => "通常",
            Self::NumberOnly => "数値のみ",
            Self::FizzBuzzOnly => "FizzBuzzのみ",
        }
    }
}

Rust の enum は PHP の enum(8.1+)や Java の enum よりも強力で、パターンマッチングの網羅性チェックをコンパイラが行います。

12.5 他言語との比較

概念 Rust PHP Go Java
エラーハンドリング Result<T, E> try-catch error 戻り値 try-catch
null 安全 Option<T> nullable types ゼロ値 Optional<T>
列挙型 enum(代数的データ型) enum(PHP 8.1+) const + iota enum
エラー伝播 ? 演算子 throw if err != nil throws
パターンマッチ match(網羅性チェック) match(PHP 8.0+) switch switch

12.6 まとめ

この章では以下を学びました。

概念 Rust の実現方法
エラーハンドリング Result<T, E> + ? 演算子
null 安全 Option<T> + パターンマッチ
列挙型 enum + メソッド実装
型安全なファクトリ enumBox<dyn Trait> 変換

全 12 章を通じて、Rust の TDD 基本サイクル、開発環境の自動化、オブジェクト指向的な設計、関数型プログラミングの活用を一通り学びました。Rust の所有権システム、トレイト、enum、Result/Option は、安全で堅牢なソフトウェアを構築するための強力な基盤です。