複数のエラー型
Resultが他のResultと連携したり、Optionが他のOptionと連携するなど、今までの例はとても便利な物でした。
時にはOptionがResultと連携したり、Result<T, Error1>がResult<T, Error2>と連携する必要もあるでしょう。そのような場面では、異なるエラー型を構成しやすく、かつ連携しやすく管理したいです。
以下のコードはunwrapの2つのインスタンスが異なるエラー型を生成します。Vec::firstはOptionを返し、一方でparse::<i32>はResult<i32, ParseIntError>を返しています。
fn double_first(vec: Vec<&str>) -> i32 { let first = vec.first().unwrap(); // エラー1の生成 2 * first.parse::<i32>().unwrap() // エラー2の生成 } fn main() { let numbers = vec!["42", "93", "18"]; let empty = vec![]; let strings = vec!["tofu", "93", "18"]; println!("The first doubled is {}", double_first(numbers)); println!("The first doubled is {}", double_first(empty)); // エラー1:入力が空ベクタ println!("The first doubled is {}", double_first(strings)); // エラー2:要素が数字としてパースできない。 }
この先の節では、これらの問題を処理する方法について見ていきます。