Option

Option<T>は値があるないかを表現する為の型です。ある場合はSome<T>、ない場合はNoneになります。

let option_thirty_three = Some(33);
let none = None as Option<i32>;

Optionな値は基本中身を取り出してから使います。そのⅠつが::unwrapです。これは値がSome<T>の時Tを取り出してくれます。

assert_eq!(Some(33).unwrap(), 33);

ただし、これは値が入ってるので大丈夫ですがNoneに対して呼んでしまうと Panic を起こしてしまいます。

assert_eq!((None as Option<i32>).unwrap(), 33);
// thread 'main' panicked at 'called `Option::unwrap()`
// on a `None` value'

Noneの時はデフォルト値を返したいなどの場合は、::unwrap_orを使います。

assert_eq!((None as Option<i32>).unwrap_or(66), 66);

もしくは Panic のままエラー文章だけ分かりやすくしたい場合は、::expectを使います。

assert_eq!((None as Option<i32>).expect("a value isn't equal 33"), 33);
// thread 'main' panicked at 'a value isn't equal 33'

値の加工

Optionのまま値を更新できるのが::mapです。

assert_eq!(
  Some(33).map(|mut thirty_three| {
    thirty_three += 1;
    thirty_three
  }),
  Some(34)
);