rust 如何追加到PathBuf

cs7cruho  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(296)

有没有一种优雅的方法可以将.bak这样的后缀附加到Path上,然后得到一个新的PathBuf

let p = Path::new("foo.c");
let p_bak = /* ? */;
assert_eq!(p_bak, Path::new("foo.c.bak"));

对于字符串,我们可以使用format!("{}.bak", file_name);对于路径,我看不到明显的等价物。with_extension()不能完全做到这一点,因为p.with_extension("bak")将创建foo.bak,而不是所需的foo.c.bak
最“明显”的解决方案是定义一个append_to_path()并使用append_to_path(p, ".bak")

fn append_to_path(p: &Path, s: &str) -> PathBuf {
    let mut p_osstr = p.as_os_str().to_owned();
    p_osstr.push(s);
    p_osstr.into()
}

有没有更简短的表达方式?
tap crate允许将其放在一个流线型的表达式中,但它仍然让人感觉相当神秘:

let p_bak: PathBuf = p.as_os_str().to_owned().tap_mut(|s| s.push(".bak")).into();
eh57zj3b

eh57zj3b1#

let p_bak: PathBuf = (p.to_string_lossy().to_string() + ".bak").into();
// or
let p_bak: PathBuf = PathBuf::from(p.to_string_lossy().to_string() + ".bak");

使用to_string_lossy可避免使用to_string,后者返回Option<&str〉,但仅当我们知道字符串将由有效的unicode字符组成时才应使用

相关问题