2015-02-17 7 views
5

Prima di aggiornare ad una recente versione più Rust quanto segue usato per lavorare:Che cos'è un modo pulito per convertire un risultato in un'opzione?

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

Tuttavia, ora il metodo parse restituisce un Result tipo invece di un Option.

Potrei creare un Option tramite un condizionale, ma esiste un modo migliore/più pulito?

risposta

8

Yup! Utilizzare Result::ok. Tipi aggiunto per chiarezza:

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

Tuttavia, se si dispone di un iteratore di Result s, è possibile collect in un unico grande Result. Ciò è meno ovvio, ma è possibile controllare gli implementatori di FromIterator per l'elenco completo degli elementi disponibili di collect.

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

Ovviamente, è possibile convertire l'unico risultato in un'opzione, come mostra il primo esempio.

Problemi correlati