2013-10-22 5 views
7

Ich versuche, eine Zeichenfolge in eine Liste von Fließkommawerten in Rust zu analysieren. Ich würde annehmen, dass es einen cleveren Weg gibt, dies mit Iteratoren und Option s zu tun; Ich kann jedoch nicht die Err Werte ignorieren, die aus fehlgeschlagenen parse() - Aufrufen resultieren. Das Rust-Tutorial scheint keine derartigen Beispiele zu enthalten, und die Dokumentation ist bestenfalls verwirrend.Wie analysiere ich eine Zeichenfolge in eine Liste von Schwimmern mit funktionalen Stil?

Wie würde ich über die Implementierung der funktionalen Vektor/Liste-Operationen gehen? Pointer auf besseren Rust-Stil für meine iterative Implementierung würden ebenfalls geschätzt werden!

"Functional" -Stil

gerät in Panik, wenn er trifft eine Err

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

Iterative-Stil

Ignoriert Nicht-Float-Werte wie beabsichtigt

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

Antwort

8

filter_map tut, was Sie wollen, sind die Werte transformieren und None s Ausfiltern:

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

Notiere die ok Methode, um die Result zu einem Option zu konvertieren.

Verwandte Themen