Rust by Example

16.7 OptionとResultを同時に扱う

前項までの例では、ResultResultと、OptionOptionとしか関わらなかったため、非常に扱いやすいものでした。とはいえ、常にこのような扱いやすい場合ばかりではありません。OptionResultが、あるいはResult<T, Error1>Result<T, Error2>とが関わる場合もあります。

以下は、一方がOptionを返し、もう一方がResultを返すような場合です。unwrapが汚いエラーメッセージを返すことを除けば、これは筋の通ったやり方に見えます。

// まずは単純に`unwrap`を用いてみましょう。これは前述の好ましくない // エラーメッセージを引き起こします。 fn double_first(vec: Vec<&str>) -> i32 { // ベクタが空の場合どうなる? let first = vec.first().unwrap(); // 要素が数値にパースできない場合、どうなる? 2 * first.parse::<i32>().unwrap() } fn main() { let numbers = vec!["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)); // ^ 2つ目のエラーを見たければこの行をコメントアウトしましょう。 println!("The first doubled is {}", double_first(strings)); }

See also:

Resultio::Result