rust 将unwrap()替换为?会使代码更加复杂,而不是简化代码

cclgggtu  于 2023-01-30  发布在  其他
关注(0)|答案(1)|浏览(228)

这段代码删除文件夹中的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而不是Resultunwrap(),在本例中,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(())}

如何替换处理Optionunwrap()而不使代码更复杂(特别是,没有那么多嵌套)?或者至少不像我分享的那个那么复杂?

ffx8fchx

ffx8fchx1#

在许多情况下,调用unwrap实际上并不是一个错误,您只是想做一些不同的事情(或者根本不想做)。
如果你只对png扩展感兴趣,检查一下你得到的是否是None或者.jpg都没有关系。
打印文件名可能会失败,因为文件名可以包含非unicode字符,而Rust字符串不能。在这种情况下,假定它是人类可读的,打印to_string_lossy()输出(替换非unicode字符)或使用调试模式(转义非unicode字符)打印它可能是好的。

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() {
            if let Some(ext) = path.extension() {
                if ext == "png" {
                    fs::remove_file(&path)?;
                    // I would keep expect here as extension would return None if there was no filename
                    // to_string_lossy returns a printable string - possibly replacing non-unicode characters
                    println!("{}", path.file_name().expect("File has no name").to_string_lossy());
                }
            }
        }
    }
    Ok(())
}

相关问题