Rust by Example

16.4 Result

ここまでで、値が欠如している可能性を扱うためにOptionを使用する例を見てきました。このように値が存在しないことは、時としてエラーを生じさせることがあります。たとえばNoneをアンラップしようとした場合などがそうです。より一般的に、様々な場所・理由で失敗しうる場合にはOptionはより包括的なResult型で置き換えることができます。Result<T, E>には以下の様な変種が存在します。

  • Ok<T>: 要素Tが見つかった場合
  • Err<E>: 要素Eとともにエラーが見つかった場合

Optionと同様、Resultもまたunwrap()メソッドを持っており、これは要素Tを産出するかpanic!()します。今のところは、これはOptionとほぼ同じに見えるでしょう。

fn double_number(number_str: &str) -> i32 { // 文字列は常に他の型にパースできるとは限らない。 // ゆえに、`parse()`は失敗の可能性があることを意味する`Result`型を返す。 // ここでは単に`unwrap`して数字を取り出すことを試みている。 // これが、良くない事態を招く可能性とは? 2 * number_str.parse::<i32>().unwrap() } fn main() { let twenty = double_number("10"); println!("double is {}", twenty); let tt = double_number("t"); println!("double is {}", tt); }

明らかに、Errでパニックした結果、役に立たないエラーメッセージをあとに残すのみとなってしまっています。このエラーの内容から、libcoreで何が起こっているかを推測することができるでしょうか?もっといい方法があるはずです。

See also:

Result