当我尝试一种我不熟悉的新语言时,我的hello世界列出了在混合文件(例如日志文件)中找到的所有IPv4。我认为这是一个很好的练习,因为它让我练习IO、包、函数、正则表达式和迭代器。
我试了2-3个小时来实现这一点,但我仍然没有找到任何优雅的方法来做到这一点。显然我做错了。
有人能告诉我他们的解决方案吗?它将帮助我的大脑解锁,看到最有效/最优雅的方式。还是你建议我继续对这堆东西大打出手,直到我得到正确的答案?
将文件名传递给函数,函数返回该文件中所有IPv4的迭代器.
我看到了Rust支持迭代器以及生成器/产量。如果可能的话,我希望找到解决办法。
发布于 2020-07-06 07:27:27
为了简单起见,我避免了错误处理(使用unwrap和expect),因为它可能会损害可读性。对于这种任务,您不需要外部crates (例如regexes),因为一些解析已经在标准库中用FromStr实现了。对于按行读取BufRead特征的BufReader包装器,可能会做到这一点。并组成它成为(游乐场):
fn iterate_over_ips(filename: impl AsRef<Path>) -> impl Iterator<Item = Ipv4Addr> {
let file = File::open(filename).unwrap();
io::BufReader::new(file)
.lines()
.map(|line| line.expect("line read").parse().expect("ip invalid format"))
}生成器是一个不稳定的特性(因此它的API随时可能改变),目前主要是由编译器在内部使用异步代码。迭代器可以更好地完成这一特定任务。
https://stackoverflow.com/questions/62748026
复制相似问题