2013-10-22 13 views
7

Sto cercando di analizzare una stringa in un elenco di valori in virgola mobile in Rust. Presumo che ci sia un modo intelligente per farlo usando gli iteratori e Option s; tuttavia, non riesco a far sì che ignori i valori Err risultanti da chiamate parse() non riuscite. Il tutorial di Rust non sembra coprire esempi come questo, e la documentazione è confusa al meglio.Come analizzare una stringa in un elenco di oggetti mobili utilizzando lo stile funzionale?

Come procedere per l'implementazione utilizzando le operazioni vettore/elenco di stile funzionale? Sarebbero apprezzati anche i puntatori su un migliore stile di ruggine per la mia implementazione iterativa!

"funzionale" in stile

Panics quando incontra un Err

input.split(" ").map(|s| s.parse::<f32>().unwrap()).collect::<Vec<_>>() 

iterativo stile

ignora i valori non float come inteso

fn parse_string(input: &str) -> Vec<f32> { 
    let mut vals = Vec::new(); 
    for val in input.split_whitespace() { 
     match val.parse() { 
      Ok(v) => vals.push(v), 
      Err(_) =>(), 
     } 
    } 
    vals 
} 

fn main() { 
    let params = parse_string("1 -5.2 3.8 abc"); 
    for &param in params.iter() { 
     println!("{:.2}", param); 
    } 
} 

risposta

8

filter_map fa ciò che si vuole, trasformando i valori e filtrando None s:

input.split(" ").filter_map(|s| s.parse::<f32>().ok()).collect::<Vec<_>>(); 

Nota Il metodo ok per convertire il Result a un Option.

Problemi correlati