Open4
rust transpose
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 を入れ替えることができる
語源
transpose -> 転置
いつ使うのか
- 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
を外しやすくなる