複数のエラー型

Resultが他のResultと連携したり、Optionが他のOptionと連携するなど、今までの例はとても便利な物でした。

時にはOptionResultと連携したり、Result<T, Error1>Result<T, Error2>と連携する必要もあるでしょう。そのような場面では、異なるエラー型を構成しやすく、かつ連携しやすく管理したいです。

以下のコードはunwrapの2つのインスタンスが異なるエラー型を生成します。Vec::firstOptionを返し、一方で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:要素が数字としてパースできない。
}

この先の節では、これらの問題を処理する方法について見ていきます。