Rust の Result を良い感じにまとめるには
   1 min read

…というのを検索する用語が "エラーハンドリング(error handling)" だということに気付くまでにも時間がかかるくらいの初級者です。

Rust でのエラーハンドリングについては歴史的変遷があるようで、ググると結局今はどうやったらええねん、という新たな疑問が湧いてきます。

取り敢えず 2021/10 現在は、 anyhow(+ 自分でエラー定義する場合は thiserror) を利用するのが良さそうです。 この辺りは README に書きました。

src/bin/gear07.rs
use anyhow::Result;

fn get_int_from_file() -> Result<i32> {
    let path = "number.txt";

    let num_str = std::fs::read_to_string(path)?;

    let num = num_str.trim().parse::<i32>().map(|t| t * 2)?;

    Ok(num)
}

fn main() {
    match get_int_from_file() {
        Ok(x) => println!("{}", x),
        Err(e) => println!("{:#?}", e),
    }
}

それ以外、外部クレートを利用しない方式としては、

にあるような Box 化して取り扱う方式があるようです。

src/bin/rust-book.rs
use std::error::Error;

fn get_int_from_file() -> Result<i32, Box<dyn Error>> {
    let path = "number.txt";

    let num_str = std::fs::read_to_string(path)?;

    let res = num_str.trim().parse::<i32>().map(|t| t * 2)?;

    Ok(res)
}

fn main() {
    match get_int_from_file() {
        Ok(x) => println!("{}", x),
        Err(e) => println!("{}", e),
    }
}

あるいは別の方法として 自前のエラー型でラップする(18.4.5. エラーをラップする, 原文)方法も解説がありました(src/bin/gear03.rs)。