見出し画像

Rust Resultとは 使い方と注意点について

今回はRustにおけるResultについて説明していきます。

Resultとは

Result型は操作が成功した場合とエラーが発生した場合の両方を表現できる列挙型で、エラーハンドリングに広く使用されます。

この型は非常に有用で、Rustでのエラーハンドリングの中心的な要素です。


Resultの使い方

Result型は成功した場合にOk(T)で値をラップし、エラーが発生した場合にはErr(E)でエラーをラップします。

Tは成功時のデータ型、Eはエラー時の型を表します。

fn divide(numerator: f64, denominator: f64) -> Result<f64, &'static str> {
    if denominator == 0.0 {
        Err("Cannot divide by zero")
    } else {
        Ok(numerator / denominator)
    }
}

fn main() {
    match divide(10.0, 0.0) {
        Ok(result) => println!("Result: {}", result),
        Err(e) => println!("Error: {}", e),
    }
}

除算を行う関数divideがResult型を返しており、ゼロ除算の場合はエラーを返します。


Resultの注意点

エラーハンドリングの重要性

Resultを返す関数を使用する際は常にエラーの可能性を考慮し、match文やunwrap_or_else、?オペレータなどを使用して適切に処理する必要があります。

エラー型の選定

Resultのエラー型Eにはどんな型でも使うことができますが、一般的にはエラー情報を豊富に含む型(std::io::Errorやカスタムエラー型)が推奨されます。これにより、エラーの原因をより詳細に理解しやすくなります。

エラー伝播

Rustでは?オペレータを使用してResult型の値からエラーを簡単に伝播させることができます。これにより、ネストされたエラーチェックをスッキリと書くことができ、コードの可読性が向上します。

fn process_file() -> Result<(), std::io::Error> {
    let mut file = File::open("somefile.txt")?;
    let mut contents = String::new();
    file.read_to_string(&mut contents)?;
    println!("File contents: {}", contents);
    Ok(())
}


Rustをもっと詳しくなりたい方に

Rustプログラミング完全ガイド 他言語との比較で違いが分かる!

個人的には他の言語開発もそれなりにあったことからこの本を読むことでかなりRustへの理解が深まりました。
プログラムやシステム的な専門用語は当たり前に登場するものの、他の言語での開発経験がある方なら問題ないでしょう。むしろその経験があることで、多言語との比較をしながら読み進めることができます。
内容的には大容量かつ丁寧すぎるほど嚙み砕いて説明がされているため、情報量は十分といえます。Rust自体学習コストが高く、難易度の高い言語のためこのくらいが妥当といえます。
プログラミング初心者レベルの方には難しい内容となっていますが、Rustの概念を理解し、基礎を把握することができる本であること間違いなしです。

Rust学習のために筆者が実際に読んでおすすめしたい本をまとめています。


基礎から学ぶRustプログラミング入門

本コースではRustについて全く経験がない方でもスムーズに学習を進められるようにとなっています。
基本的にはコードベースで解説を行い、抽象度が高く難しい内容に関しては適宜スライドも使いながら丁寧に解説します。そしてただ文法を学ぶだけではなく、最終的には演習としてCLIアプリケーションを作成し学習内容の定着を図ります。

以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。

※本ページではアフィリエイトリンク(PR)が含まれています


この記事が参加している募集

#この経験に学べ

53,111件

この記事が気に入ったらサポートをしてみませんか?