問題一覧に戻る
中級エラー処理
問題60: and_then(フラットマップ)
and_thenはOption/Resultを返す関数をチェインします。mapと違い、入れ子にならずフラット化されます。複数の可能な失敗を連鎖的に処理でき、モナディックな操作の一種です。エラー処理をシンプルに保ちながら、複雑なビジネスロジックを表現できます。
fn parse_double(s: &str) -> Result<i32, &'static str> {
s.parse::<i32>()
.map_err(|_| "parse error")
// and_thenチェイン
.(|n| {
if n > 0 {
Ok(n * 2)
} else {
Err("negative number")
}
})
}
fn main() {
let opt = Some(5);
// Optionのチェイン
let result = opt
.(|x| if x > 0 { Some(x * 2) } else { None });
println!("{:?}", result);
println!("{:?}", parse_double("10"));
println!("{:?}", parse_double("-5"));
}