🦀

【Rust入門】Result型とは?

2024/09/03に公開

はじめに

こんにちは、ファスト株式会社のyutakです!
今回は、Rustについての記事です。
弊社では、Web APIの開発言語としてRustを採用しました。
なぜRustを採用したのかについては、今後の記事で詳しく説明する予定です!

本記事について

どのプログラミング言語でも、プロダクトの実装を進めていくとエラー処理が重要になってきます。
RustにはResult型という強力なエラー処理の機構があります。
本記事では、Result型について説明していきます。

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

エラーハンドリングは、プログラムの信頼性と堅牢性を確保する上で非常に重要です。
適切なエラーハンドリングにより、以下が可能となります。

  • 予期せぬ動作を防止できる
  • デバッグが容易になる
  • プログラムのバグの原因を突き止めやすくなる

Result型の概要

Result型とは、Rustの標準ライブラリに含まれる列挙型(enum)です。
ある処理が成功したか失敗したかを表現するために使用されます。
RustにはPythonやJavaのような例外機構がないため、ResultはRustにおける標準的なエラーハンドリング方法となっています。

Result型のメリット

Result型には以下のようなメリットがあります。

コンパイル時のチェック

Result型の戻り値を無視すると、コンパイラが警告を出してくれます。
これにより、エラー処理の忘れを防ぐことができます。

また、エラーの可能性がある操作を明示的に示すことができ、コードの読みやすさと保守性が向上します。

エラーの伝播

?演算子を使用することで、エラーを簡単に上位の関数に伝播させることができます。

型安全性

Err(E)のEはジェネリック型パラメータであるため、カスタムエラー型を使用して、より詳細なエラーハンドリングを行うことができます。

Result型について

Result型の基本的な構造

Result型は以下のように定義されています。先述の通り、Resultは列挙型です。

enum Result<T, E> {
    Ok(T),
    Err(E),
}

定義の詳細について

  • Ok(T): 処理が成功した場合の値を保持する。Tは成功時の値の型
  • Err(E): 処理が失敗した場合のエラー情報を保持する。Eはエラーの型

具体例

Result型の使用例として、テキストファイルを開いて内容を読み取る実装を書いていきます。
以下がサンプルです。

use std::fs::File;
use std::io::Read;

fn read_file_contents(path: &str) -> Result<String, std::io::Error> {
    let mut file = File::open(path)?;
    let mut contents = String::new();
    file.read_to_string(&mut contents)?;
    Ok(contents)
}

fn main() {
    match read_file_contents("example.txt") {
        Ok(contents) => println!("ファイルの内容: {}", contents),
        Err(error) => println!("ファイルの読み取りに失敗しました: {:?}", error),
    }
}

このコードの処理内容は以下となります。

  • read_file_contents関数はResult<String, std::io::Error>を返す
  • ?演算子を使用して、File::openread_to_stringのエラーを伝播
  • main関数ではmatch式を使って結果を処理している

まとめ

今回は、RustのResult型について説明していきました。
Result型を適切に使用することで、安全で堅牢なプログラムが書けます。

今回は基本的な使い方について紹介しましたが、Result型には多くの機能があります。
また、anyhowやthiserrorのクレートを使うことで
詳細な状況や実際の使い方の詳細などは参考資料を見ていただければと思います。

まだまだ、Result型についての魅力はあったり、Result型と相性が良いanyhowやthiserrorクレートがあるので次回以降説明していく予定です。

参考資料

Module std::result - Rust docs

18.4. Result - Rust By Example

GitHubで編集を提案
FAST Tech Blog

Discussion