1737


Rust言語を最近はじめました。 stdライブラリから少しずつコードを読んでいますが、 一つわからないことがあります。

頻繁に出てくる`unwrap()`函数が、 何のために、何に対して、何を返してるのか、が把握できません。

英語のドキュメントをみても、いまいち意味が飲み込めず、、。 ご存知の方がいましたら、ご教授ください。


CC BY-SA 3.0
2014-12-16T09:45:39.437
1730
2018-06-01T07:23:10.223
2014-12-16T13:00:19.390
30
2463
question
rust
Rustの"unwrap()"は何をするものですか？


`unwrap()` は、 `Option<T>` 型や `Result<T, E>` 型の値（つまり、何かしらの値を _ラップ_
している値）から中身の値を取り出す関数です。たとえば `Option<T>` 型の値に対して `unwrap()` を呼ぶと、それが内包する `T`
型の値を返します。

`unwrap()` は失敗するかもしれないことに注意が必要です。 `Option<T>` 型や `Result<T, E>` 型などの値は、 `T`
型の値が入っていることもあれば入っていないこともあります。入っていない場合に `unwrap()` を呼ぶとプログラムは panic します。

[code]

    let opt: Option<i32> = Some(42);
    println!("{}", opt.unwrap()); // 42 を表示
    let opt: Option<i32> = None;
    println!("{}", opt.unwrap()); // ここで panic
    
[/code]

`unwrap()` は記述を簡潔にするためサンプルコードで使用されることがありますが、普段は使用を避けてパターンマッチや `unwrap_or()`
などの安全な関数で値を取り出したほうがいいでしょう。

[code]

    let opt: Option<i32> = None;
    match opt {
        Some(_) => println!("some!"),
        None => println!("none!"),
    }
    // none! を表示
    
    println!("{}", opt.unwrap_or(0)); // 0 を表示
    
[/code]

動作は `unwrap()` と同じですが panic したときのカスタムメッセージを指定できる `expect()`
もあります。値が入っていることが確実に分かっていて、そうでなければバグとしてクラッシュしていいという場合には `expect()` を使ってもよいでしょう。

`RefCell<T>` なども何かしらの値をラップしている値といえますが、この場合は `T`
型の値が入っていることが保証されています。必ず中身が入っている型から内包された値を取り出す関数は、panic しないことを明確にするため
`unwrap()` ではなく `into_inner()` と命名されています。


CC BY-SA 4.0
2014-12-16T10:29:11.110
1737
2018-06-01T07:23:10.223
2018-06-01T07:23:10.223
2259
2259
1730
answer