2015-02-17 13 views
5

Przed aktualizacją do nowszej wersji Rust następuje wykorzystywane do pracy:Jaki jest czysty sposób przekonwertowania wyniku na opcję?

let parsed_value: Vec<usize> = val.iter() 
            .filter_map(|e| e.parse::<usize>()) 
            .collect(); 

Jednak teraz metodę parse zwraca Result typ zamiast Option.

Mogę utworzyć Option za pomocą warunkowego, ale czy istnieje lepszy/czystszy sposób?

Odpowiedz

8

Tak! Użyj Result::ok. Rodzaje dodana dla jasności:

let res: Result<u8,()> = Ok(42); 
let opt: Option<u8> = res.ok(); 
println!("{:?}", opt); 

Jednak jeśli masz iteratorem Result s, można collect je w jeden wielki Result. Jest to mniej oczywiste, ale można sprawdzić dostawców FromIterator, aby uzyskać pełną listę elementów dostępnych pod numerami collect.

let strs = &["1", "2", "3", "4"]; 
let nums: Result<Vec<u8>, _> = strs.iter().map(|s| s.parse()).collect(); 
println!("{:?}", nums); 

Oczywiście można następnie przekształcić jeden duży wynik w opcję, jak pokazuje pierwszy przykład.

Powiązane problemy