这段代码删除文件夹中的PNG文件并打印它们。我想通过用?
替换所有的unwrap()
来简化它。
use std::fs;
use std::path::Path;
fn main() -> Result<(), std::io::Error> {
let path = Path::new("/home/alex/Desktop");
for entry in fs::read_dir(path)? {
let entry = entry?;
let path = entry.path();
if path.is_file() && path.extension().unwrap() == "png" {
fs::remove_file(&path)?;
println!("{}", path.file_name().unwrap().to_str().unwrap());
}
}
Ok(())
}
我发现我不能替换处理Option
而不是Result
的unwrap()
,在本例中,extension()
、file_name()
和to_str()
。
我修改了代码来解决这个问题。然而,代码却变得更加复杂:
use std::fs;
use std::path::Path;
fn main() -> Result<(), std::io::Error> {
let path = Path::new("/home/alex/Desktop");
for entry in fs::read_dir(path)? {
let entry = entry?;
let path = entry.path();
if path.is_file() {
let ext = path.extension().ok_or(std::io::Error::new(std::io::ErrorKind::Other, "Invalid file extension"))?;
if ext == "png" {
fs::remove_file(&path)?;
println!("{}", path.file_name().ok_or(std::io::Error::new(std::io::ErrorKind::Other, "Invalid file name"))?.to_str().ok_or(std::io::Error::new(std::io::ErrorKind::Other, "Invalid file name"))?);
}
}
}
Ok(())}
如何替换处理Option
的unwrap()
而不使代码更复杂(特别是,没有那么多嵌套)?或者至少不像我分享的那个那么复杂?
1条答案
按热度按时间ffx8fchx1#
在许多情况下,调用
unwrap
实际上并不是一个错误,您只是想做一些不同的事情(或者根本不想做)。如果你只对
png
扩展感兴趣,检查一下你得到的是否是None
或者.jpg
都没有关系。打印文件名可能会失败,因为文件名可以包含非unicode字符,而Rust字符串不能。在这种情况下,假定它是人类可读的,打印
to_string_lossy()
输出(替换非unicode字符)或使用调试模式(转义非unicode字符)打印它可能是好的。