如何替换PathBuf或Path的文件扩展名?

如何替换PathBuf或Path的文件扩展名?,path,rust,Path,Rust,我目前的解决办法是: let temp = format!( "{}.png", path.file_stem().unwrap().to_string_lossy()); path.pop(); path.push(&temp); 这非常难看,需要至少6个函数调用并创建一个新字符串 有没有更惯用、更短或更有效的方法来实现这一点?PathBuf提供了该方法。如果一个扩展尚不存在,它将添加该扩展;如果存在,它将替换为新的扩展 let mut path

我目前的解决办法是:

let temp = format!(
    "{}.png",
    path.file_stem().unwrap().to_string_lossy());
path.pop();
path.push(&temp);
这非常难看,需要至少6个函数调用并创建一个新字符串


有没有更惯用、更短或更有效的方法来实现这一点?

PathBuf
提供了该方法。如果一个扩展尚不存在,它将添加该扩展;如果存在,它将替换为新的扩展

let mut path = PathBuf::from("path/to/file");
path.set_extension("png");
assert_eq!(&path.to_string_lossy(), "path/to/file.png");

let mut path = PathBuf::from("path/to/file.jpg");
path.set_extension("png");
assert_eq!(&path.to_string_lossy(), "path/to/file.png");

PathBuf
提供了方法。如果一个扩展尚不存在,它将添加该扩展;如果存在,它将替换为新的扩展

let mut path = PathBuf::from("path/to/file");
path.set_extension("png");
assert_eq!(&path.to_string_lossy(), "path/to/file.png");

let mut path = PathBuf::from("path/to/file.jpg");
path.set_extension("png");
assert_eq!(&path.to_string_lossy(), "path/to/file.png");

谢谢,不知道我是怎么错过的谢谢,不知道我是怎么错过的