なぜ`Result<T>`で値が返ってくるのか


[Rustの“unwrap()”は何をするものですか？](https://ja.stackoverflow.com/questions/1730/rust%E3%81%AEunwrap%E3%81%AF%E4%BD%95%E3%82%92%E3%81%99%E3%82%8B%E3%82%82%E3%81%AE%E3%81%A7%E3%81%99%E3%81%8B)を読んでいて、また、自身の短い経験を通して疑問をいただいたことがあるので質問です。  
`unwrap()`を使うシーンはいくつかあったのですが、なぜそもそも`Result<T>`のように`unwrap()`しないと値を取り出せない形になっているのでしょうか。そのまま`T`で値を返してくれたほうが毎回`unwrap()`しなくて便利だと思いますがどういった理由が考えられますでしょうか。




こんにちは。`unwrap` や `Result` の話はドキュメントの[エラーハンドリング](https://rust-lang-
ja.github.io/the-rust-programming-language-ja/1.6/book/error-
handling.html)に詳しく書かれているのですが、質問から察するにRustのコードとりあえず書いてみて、生じた疑問を書いている状況でしょうか。そういう想定の下、回答します。

ひとまず、質問に対する直接的な回答は「`unwrap`で取り出す値以外の可能性もあるから」です。以下にこれを丁寧に説明します。

まず、
Rustは例外を使わず返り値で失敗を表します。他言語でいう例外に綺麗に対応するものはありません。しかし失敗する可能性のある計算というのもあります。たとえば文字列を数値にパースするだとかの処理ですね。  
そういう成功するか失敗するか分からない計算の返り値に `Result` が使われます。  
参考のリンクに貼られている回答では`Result<T>`と書いていますがあれは恐らく省略したかtypoで、本来は `Result<T, E>`
です。`T`が成功した場合の値、`E`が失敗した場合の値です。

たとえば`Result` を返す [`parse`](https://doc.rust-
lang.org/beta/std/primitive.str.html#method.parse)は以下のように成功した場合と失敗した場合の処理を記述できます。

[code]

    fn main() {
        match "not a number".parse::<i32>() {
            Ok(n) => println!("got a number {}", n),
            Err(e) => println!("failed to parse: {}", e),
        }
        // -> failed to parse: invalid digit found in string
    }
    
[/code]

なので

> なぜそもそもResultのようにunwrap()しないと値を取り出せない形になっているのでしょうか。

の質問はやや正しくなく、`unwrap` は取り出す手段の一つですね。  
`unwrap` はこのエラー処理をせず、エラーが起きたらそのままRustのプログラムを終了させてしまう(panicする)関数です(試しに `"not a
number".parse::<i32>().unwrap()` などと呼んでみると分かるかと思います)。  
有無を言わさずプログラムを終了して開発者向けのメッセージだけ残すのであまり行儀のいいものではないのですがエラー処理を省けるのでチュートリアルなどでよく使われます。

まとめると

  * `Result` を返しているのは失敗する可能性もあるから
  * 「`unwrap` で値を取り出す」は実はあまり良くない書き方




こんにちは。`unwrap` や `Result` の話はドキュメントの[エラーハンドリング](https://rust-lang-
ja.github.io/the-rust-programming-language-ja/1.6/book/error-
handling.html)に詳しく書かれているのですが、質問から察するにRustのコードとりあえず書いてみて、生じた疑問を書いている状況でしょうか。そういう想定の下、回答します。

ひとまず、質問に対する直接的な回答は「`unwrap`で取り出す値以外の可能性もあるから」です。以下にこれを丁寧に説明します。

まず、
Rustは例外を使わず返り値で失敗を表します。他言語でいう例外に綺麗に対応するものはありません。しかし失敗する可能性のある計算というのもあります。たとえば文字列を数値にパースするだとかの処理ですね。  
そういう成功するか失敗するか分からない計算の返り値に `Result` が使われます。  
参考のリンクに貼られている回答では`Result<T>`と書いていますがあれは恐らく省略したかtypoで、本来は `Result<T, E>`
です。`T`が成功した場合の値、`E`が失敗した場合の値です。

たとえば`Result` を返す [`parse`](https://doc.rust-
lang.org/beta/std/primitive.str.html#method.parse)は以下のように成功した場合と失敗した場合の処理を記述できます。

[code]

    fn main() {
        match "not a number".parse::<i32>() {
            Ok(n) => println!("got a number {}", n),
            Err(e) => println!("failed to parse: {}", e),
        }
        // -> failed to parse: invalid digit found in string
    }
    
[/code]

なので

> なぜそもそもResultのようにunwrap()しないと値を取り出せない形になっているのでしょうか。

の質問はやや正しくなく、`unwrap` は取り出す手段の一つですね。  
`unwrap` はこのエラー処理をせず、エラーが起きたらそのままRustのプログラムを終了させてしまう(panicする)関数です(試しに `"not a
number".parse::<i32>().unwrap()` などと呼んでみると分かるかと思います)。  
有無を言わさずプログラムを終了して開発者向けのメッセージだけ残すのであまり行儀のいいものではないのですがエラー処理を省けるのでチュートリアルなどでよく使われます。

まとめると

  * `Result` を返しているのは失敗する可能性もあるから
  * 「`unwrap` で値を取り出す」は実はあまり良くない書き方

