Result map処理

Resultに用意されているmap処理

  • map: Okの型を変換する
  • map_err: Errの型を変換する
  • map_or: 値をアンラップする。デフォルト値を渡せる
  • map_or_else: 値をアンラップする。デフォルト値の評価を遅延評価する

map(成功時のmap処理)

Result<T, E> から Result<U, E>に変換する。 失敗時は何もしない。

let line = "1\n2\n3\n4\n";
for num in line.lines() {
    match num.parse::<i32>().map(|i| i * 2) {
        Ok(n) => println!("{}", n),
        Err(..) => {}
    }
    
}

map_err(失敗時のmap処理)

Result<T, E>からResult<T, F>に変換する。 成功時は、何もしない。

let str = "abc";
let result = str.parse::<i32>(); // Result<i32, ParseIntErr>
let result = parsed.map_err(|e| e.to_string());  // Result<i32, String>

カスタムのエラーを定義し、 Fromトレイトを使ったエラーハンドリングを使うことで、mpa_errを避けることが出来る。

map_or(デフォルト値, 成功時のmap処理)

値のアンラップ。

成功時: 関数を適用する 失敗時: デフォルト値を返す

デフォルト値に、関数の呼び出し結果を渡す場合は、map_or_elseを使うと、遅延評価される。

let num_str = "xyz";
let num = num_str.parse::<i32>().map_or(42, |num| num * 2);
println!("{}", num); // 42

map_or_else(デフォルト値の生成関数(遅延評価), 成功時のmap処理)

map_orの遅延評価版。値のアンラップ。

成功時: map処理を呼び出す 失敗時: デフォルト値を生成する関数を呼び出す

let x = "xyz";
let ret = x.parse::<i32>().map_or_else(|_e| x.len() as i32, |v| v);
println!("{}", ret);