2017-01-16 64 views
3

我正试图找到一个好方法将Option<String>转换为Option<i8>如何将选项<结果<T, Error>>转换为选项<T>而不打开它?

例如,

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

回答

5

你可以我们e本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)); 
} 
5

而不是创造摆在首位的Option<Result<T, E>>的,你可以结合:

  1. Option::and_then,应用于封闭返回一个Option和变平的结果。

  2. Result::ok,它将Result转换为Option,丢弃该错误。

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) 
} 
相关问题