Result
Result
は、リッチなバージョンのOption
型で_値の不在_の可能性の代わりに_エラー_の可能性を示します。
つまり、Result<T, E>
は以下の2つの結果を持ちます。
Ok<T>
:要素T
が見つかった場合Err<E>
:要素E
とともにエラーが見つかった場合
慣例により、Ok
が期待される結果であり、Err
は期待されない結果です。
Option
と同様、Result
は多くのメソッドを持ちます。例えばunwrap()
は、T
もしくはpanic
をもたらします。エラーハンドリングでは、Result
とOption
で重複するコンビネータが多くあります。
Rustを書いていく中で、parse()
メソッドなど、Result
型を返すメソッドを目にするでしょう。文字列を他の型にパースすることは必ずしも成功する訳ではないため、Result
を返すことで失敗するケースについてもカバーできるのです。
早速、文字列をparse()
した場合の成功例と失敗例を見てみましょう。
失敗例では、parse()
がエラーを返すためunwrap()
がパニックします。そして、panic
はプログラムを終了させて不快なエラーメッセージを出力します。
エラーメッセージを改善するために、リターン型に対してもっと明確になるべきで、またエラーを明示的に処理することを考えるべきです。
main
内で使うResult
Result
型は、明示的な指定によりmain
関数のリターン型にもなります。一般に、main
関数は以下のような形になるでしょう。
fn main() {
println!("Hello World!");
}
一方main
でResult
をリターン型とすることも可能です。エラーがmain
関数内で発生した時、エラーコードを返し、エラーに関するデバッグ表記を(Debug
トレイトを使って)出力します。以下の例ではそのようなシナリオを示し、この先の節でカバーする内容に触れていきます。