Result

ResultOption に似ていますが、操作の成功または失敗を、それぞれ 異なる enum バリアントで表します。これはジェネリックで、Result<T, E> の形を取り、TOk バリアントで使われ、EErr バリアントに現れます。

// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

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

fn main() {
    let file: Result<File, std::io::Error> = File::open("diary.txt");
    match file {
        Ok(mut file) => {
            let mut contents = String::new();
            if let Ok(bytes) = file.read_to_string(&mut contents) {
                println!("Dear diary: {contents} ({bytes} bytes)");
            } else {
                println!("Could not read file content");
            }
        }
        Err(err) => {
            println!("The diary could not be opened: {err}");
        }
    }
}
  • Option と同様に、成功した値は Result の中に入っているため、 開発者はそれを明示的に取り出す必要があります。これはエラーチェックを 促します。エラーが決して発生しないはずの場合は、unwrap()expect() を 呼び出すことができ、これも開発者の意図を示すシグナルになります。
  • Result のドキュメントは一読を勧めます。講義中に読むものではありませんが、 言及する価値はあります。関数型スタイルのプログラミングに役立つ便利な メソッドや関数が数多く含まれています。
  • 4日目で見るように、Result はエラーハンドリングを実装するための 標準的な型です。