2017-01-16 5 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

あなたは私たちにできます電子ok()unwrap_or()機能:代わりに、最初の場所でOption<Result<T, E>>を作成する

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

、あなたは組み合わせることができます。

  1. Option::and_thenを、Optionを返し、結果を平らにクロージャを適用します。

  2. Result::okこれはResultOptionに変換し、エラーを破棄します。

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

あなたが直接質問に答えるために、同じ2つのツールを使用することができます。

fn convert<T, E>(a: Option<Result<T, E>>) -> Option<T> { 
    a.and_then(Result::ok) 
} 
関連する問題