Option<Result<T>> と Result<Option<T>> を相互変換する transpose について。
Option と Result にそれぞれ同じ名前のメソッドがある。
Option::transpose
impl<T, E> Option<Result<T, E>> {
pub const fn transpose(self) -> Result<Option<T>, E> {
// ... //
}
}
Result::transpose
impl<T, E> Result<Option<T>, E> {
pub const fn transpose(self) -> Option<Result<T, E>> {
// ... //
}
}
使用頻度が多いのは Option<Result<T>> から Result<Option<T>> への変換である。これにはより重要な意味を持つ Result を外側にする事で型を扱いやすくする効果がある (逆方向の変換の存在は対称性があって嬉しいが滅多に使われない)。
以下では、空かもしれない数字を解析している。
use std::num::ParseIntError;
fn main() {
assert_eq!(parse(""), Ok(None));
assert_eq!(parse("3"), Ok(Some(3)));
assert!(parse("three").is_err());
}
fn parse(input: &str) -> Result<Option<i32>, ParseIntError> {
let has_input = !input.is_empty();
let opt_result = has_input.then(|| input.parse());
opt_result.transpose()
}