Open4

rust transpose

katayama8000katayama8000
pub fn run() {
    let val = func().map(|x| x * 2);
    let val2: Option<Result<i32, String>> = Some(val);
    let val2: Result<Option<i32>, String> = val2.transpose();
}

fn func() -> Result<i32, String> {
    let val = Some(10);
    val.ok_or("No value".to_string())
}

Result と Option を入れ替えることができる

katayama8000katayama8000

いつ使うのか

  • Rust では、Optionを返すメソッドが割とある
  • Option の中で map して Result とか返すと Option<Result<T, E>> が出来上がる
  • このかたが、取り扱いにくいので、逆転させたくなる時がある
pub fn run() {
    let arr: Vec<i32> = vec![1, 2, 3];
    let val: Option<Result<i32, String>> = arr.last().map(|x| f(x));
    let val: Result<Option<i32>, String> = val.transpose();
}

fn f(val: &i32) -> Result<i32, String> {
    if *val == 1 {
        Ok(10)
    } else {
        Err("No value".to_string())
    }
}

こうしておけば、?とかで Result を外しやすくなる