有没有一种优雅的方法可以将.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();
1条答案
按热度按时间eh57zj3b1#
使用
to_string_lossy
可避免使用to_string
,后者返回Option<&str
〉,但仅当我们知道字符串将由有效的unicode字符组成时才应使用