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

4

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

1
2
3
4
5

我需要将一个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
    }
};

然后我解析它:

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

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

然而,我认为有一种解决方案可以在不使用循环的情况下仅用一行代码来完成,例如:

let mut data : Vec<u32> = data_str.lines_any().<SOME MAGIC>.collect();

也许可以使用 map 和 filter,但主要问题在于如何将 Option 解包为 u32,因为我无法看到如何同时过滤掉 Nones 并解包为u32。否则,仅过滤而不解包会导致进一步再次检查它们。是否有可能实现一行代码的解决方案?并且它是否是一个有效的解决方案?
1个回答

7

filter_map 是您需要寻找的函数:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接