RustのResult型に対してmapとmap_errで値を加工する

特定処理の結果Resultを受け取るパターンにおいて、最終的に返すべき値とは違うResultだった場合にis_okなどを使ってif分岐で新たなResultを定義してもよいが、mapmap_errを使えば簡単に加工できる。

fn stringify(e: i8) -> String { format!("error: {}", e) }

fn main() {
    let a: Result<i8, i8> = Ok(10);
    let b: Result<i8, i8> = Err(20);

    assert_eq!(a.map(|ok| { ok * 2 }).map_err(|e| { format!("error: {}", e) }), Ok(20));
    assert_eq!(b.map(|ok| { ok * 2 }).map_err(|e| { format!("error: {}", e) }), Err("error: 20".to_string()));

    assert_eq!(a.map(|ok| { ok * 2 }).map_err(stringify), Ok(20));
    assert_eq!(b.map(|ok| { ok * 2 }).map_err(stringify), Err("error: 20".to_string()));
}

同じエラーの処理をするなら関数でフォーマットを渡すのも手。

https://doc.rust-lang.org/std/result/enum.Result.html

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA