複数のエラー型
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:要素が数字としてパースできない。 }
この先の節では、これらの問題を処理する方法について見ていきます。