Result型 のアンラップとエラーの伝搬

Result<T, E>型の特徴

Rustは例外処理が存在しない代わりに、Result型でそれを実現する。

  • 値のアンラップ
  • エラーの伝搬

値のアンラップ

  • unwrap: Err時、panic!を引き起こす
  • unwrap_or: Err時、デフォルト値を返す
  • unwrap_or_else: Err時、デフォルト値を生成する関数を呼び出す
  • map_or: Ok時、map処理を呼び出し、Err時、デフォルト値を返す
  • map_or_else: Ok時、map処理を呼び出し、Err時、デフォルト値を生成する関数を呼び出す
  • expect: Err時、panic!を引き起こすが、メッセージを添付できる

unwrap

unwrap_or

unwrap_or_else

map_or

pub fn map_or<U, F>(self, default: U, f: F) -> U
    where
             F: FnOnce(T) -> T
  • Ok 関数を適用してその結果を返す。
  • Err デフォルト値を返す。
let x: Result<_, &str> = Ok("foo");
let len = x.map_or(42, |v| v.len());  // 値がNoneのときは、デフォルト値42が返される

map_or_else

pub fn map_or_else<U, D, F>(self, default: D, f: F) -> U
where
    D: FnOnce(E) -> U,
    F: FnOnce(T) -> U, 
  • Ok 関数fを適用してその結果を返す
  • Err fallback関数を実行してその結果を返す。
let k = 21;

let x : Result<_, &str> = Ok("foo");
assert_eq!(x.map_or_else(|e| k * 2, |v| v.len()), 3);

エラーの伝搬

  • map: Okの型を変換する
  • map_err: Errの型を変換する
  • ?演算子 : Err時、Resultをreturnする。

map

map_err

?演算子