Rust の Result を良い感じにまとめるには
…というのを検索する用語が "エラーハンドリング(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
)。