質問: Rust言語を最近はじめました。 stdライブラリから少しずつコードを読んでいますが、 一つわからないことがあります。 頻繁に出てくる`unwrap()`函数が、 何のために、何に対して、何を返してるのか、が把握できません。 英語のドキュメントをみても、いまいち意味が飲み込めず、、。 ご存知の方がいましたら、ご教授ください。
回答: `unwrap()` は、 `Option` 型や `Result` 型の値(つまり、何かしらの値を *ラップ* している値)から中身の値を取り出す関数です。たとえば `Option` 型の値に対して `unwrap()` を呼ぶと、それが内包する `T` 型の値を返します。 `unwrap()` は失敗するかもしれないことに注意が必要です。 `Option` 型や `Result` 型などの値は、 `T` 型の値が入っていることもあれば入っていないこともあります。入っていない場合に `unwrap()` を呼ぶとプログラムは panic します。 ``` let opt: Option = Some(42); println!("{}", opt.unwrap()); // 42 を表示 let opt: Option = None; println!("{}", opt.unwrap()); // ここで panic ``` `unwrap()` は記述を簡潔にするためサンプルコードで使用されることがありますが、普段は使用を避けてパターンマッチや `unwrap_or()` などの安全な関数で値を取り出したほうがいいでしょう。 ``` let opt: Option = None; match opt { Some(_) => println!("some!"), None => println!("none!"), } // none! を表示 println!("{}", opt.unwrap_or(0)); // 0 を表示 ``` 動作は `unwrap()` と同じですが panic したときのカスタムメッセージを指定できる `expect()` もあります。値が入っていることが確実に分かっていて、そうでなければバグとしてクラッシュしていいという場合には `expect()` を使ってもよいでしょう。 `RefCell` なども何かしらの値をラップしている値といえますが、この場合は `T` 型の値が入っていることが保証されています。必ず中身が入っている型から内包された値を取り出す関数は、panic しないことを明確にするため `unwrap()` ではなく `into_inner()` と命名されています。