如何转换期权<result <t,error =“”>&gt;选项<t>而不打开它?

时间:2017-01-16 18:04:29

标签: rust

我正在尝试找到一种将Option<String>转换为Option<i8>的好方法。

例如,

use std::str::FromStr;

fn main() {
    let some_option: Option<String> = Some("too".to_owned()); 
    let new_option: Option<i8> = some_option.map(|x| i8::from_str(x.as_str())); 
}

我以为我可以使用涡轮鱼来明确地施放这样的类型:

use std::str::FromStr;

fn main() {
    let some_option: Option<String> = Some("too".to_owned()); 
    let new_option: Option<i8> = some_option.map::<Option<i8>>(|x| i8::from_str(x.as_str())); 
}

然而,编译器指出这不是正确的参数数量,所以我认为这可能有用,但它没有:

use std::str::FromStr;

fn main() {
    let some_option: Option<String> = Some("too".to_owned()); 
    let new_option: Option<i8> = some_option.map::<Option<i8>,i8::from_str>(); 
}

2 个答案:

答案 0 :(得分:7)

您可以使用ok()unwrap_or()功能:

fn test() -> Option<Result<u32, ()>> {
    Some(Ok(1))
}

fn main() {
    let x: Option<Result<_, _>> = test();
    println!("{:?}", x.map(|r| r.ok()).unwrap_or(None));
}

答案 1 :(得分:7)

您可以合并:

,而不是首先创建Option<Result<T, E>>
  1. Option::and_then,它会应用一个返回Option并使结果展平的闭包。

  2. Result::ok,将Result转换为Option,弃置错误。

  3. fn main() {
        let some_option = Some("too".to_owned()); 
        let new_option = some_option.and_then(|x| x.parse::<u8>().ok()); 
    }
    

    您可以使用相同的两个工具来回答直接问题:

    fn convert<T, E>(a: Option<Result<T, E>>) -> Option<T> {
        a.and_then(Result::ok)
    }