Option<Result<T>>Result<Option<T>> を相互変換する transpose について。

メソッド一覧

OptionResult にそれぞれ同じ名前のメソッドがある。

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()
}