如何简化将文本文件解析为值向量?

Ars*_*min 1 rust

我是Rust的新手,我正在尝试找到解析文本文件的最简单有效的方法,如:

1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

到我的代码中的u32向量.现在我有一个解决方案,用于读取文件作为字符串(它正好来自rustbyexample.com,我稍微改了一下):

let path = Path::new("J:/IntegerArray.txt");
let display = path.display();

let mut file = match File::open(&path)
{
    Err(why) => panic!("couldn't open {}: {}", display, why.desc),
    Ok(file) => file,
};

let data_str = match file.read_to_string()
{
    Err(why) => panic!("couldn't read {}: {}", display, why.desc),
    Ok(string) =>
    {
        string
    }
};
Run Code Online (Sandbox Code Playgroud)

然后我解析它:

let mut data : Vec<u32> = vec![];

for str in data_str.lines_any()
{
    data.push(match str.trim().parse() { Some(x) => x, None => continue, } );
}
Run Code Online (Sandbox Code Playgroud)

但是我认为有一个解决方案可以在没有循环的情况下在一行中完成,例如:

let mut data : Vec<u32> = data_str.lines_any().<SOME MAGIC>.collect();
Run Code Online (Sandbox Code Playgroud)

也许它可以通过map和filter来完成,但主要的问题是解包u32的选项,因为我无法看到如何过滤掉Nones并同时解包到u32.否则,只需在不展开的情况下进行过滤,即可再次检查它们.单线解决方案是否可行?它会是一个有效的解决方案吗?

Ray*_*Ray 5

filter_map 正是你要找的:

let data: Vec<u32> = data_str.lines_any().filter_map(|s| s.trim().parse()).collect();
Run Code Online (Sandbox Code Playgroud)