2013-10-22 6 views
7

Próbuję parsować ciąg znaków na liście wartości zmiennoprzecinkowych w Rust. Zakładam, że jest to sprytny sposób na to, używając iteratorów i Option s; jednak nie mogę go zignorować wartości Err, które wynikają z nieudanych połączeń analizatora składni(). Samouczek Rusta nie obejmuje żadnych przykładów takich jak ten, a dokumentacja jest w najlepszym wypadku myląca.Jak przeanalizować ciąg znaków do listy elementów pływających za pomocą stylu funkcjonalnego?

W jaki sposób chciałbym wdrożyć tę operację za pomocą operacji wektorów/list w stylu funkcjonalnym? Potrzebne będą również wskazówki dotyczące lepszego stylu Rustu dla mojej iteracyjnej implementacji!

"Functional" -Style

alarm napadowy po napotkaniu Err

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

iteracyjny stylu

Ignoruje wartości non obrocie jako przeznaczone

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

Odpowiedz

8

filter_map robi to, co chcesz, przekształcając wartości i odfiltrowanie None s:

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

Informacja Metoda ok do konwersji Result do Option.