关于rust:将PathBuf转换为String时,是否有避免克隆的方法?

Is there a way to avoid cloning when converting a PathBuf to a String?

我需要简单地(并且很危险-为简便起见,不进行错误处理)获得当前的可执行文件名称。我使它工作了,但是我的函数仅将&str转换为String以便稍后在其上调用as_str()进行模式匹配。

1
2
3
fn binary_name() -> String {
    std::env::current_exe().unwrap().file_name().unwrap().to_str().unwrap().to_string()
}

据我了解,std::env::current_exe()为我提供了PathBuf的所有权,可以通过返回将其转让。就目前而言,我借用它来将其转换为&str。从那里,返回字符串的唯一方法是在PathBuf被删除之前克隆它。

有什么办法可以避免此&OsStr -> &str -> String -> &str循环?


Is there a way to avoid cloning when converting a PathBuf to a String?

绝对。但是,那不是您在做什么。您正在通过file_name占用PathBuf的一部分并将其转换。您不能拥有字符串部分的所有权。

如果不提取子集,则可以通过先转换为OsString然后转换为String来转换整个PathBuf。在这里,我忽略了特定的错误,只是返回成功或失败:

1
2
3
4
5
6
7
8
use std::path::PathBuf;

fn exe_name() -> Option<String> {
    std::env::current_exe()
        .ok()
        .map(PathBuf::into_os_string)
        .and_then(|exe| exe.into_string().ok())
}

Is there any way to avoid this &OsStr -> &str -> String -> &str cycle?

否,因为要在方法内部创建String(或OsStringPathBuf,取决于代码的变体,所有权取决于所有权)。签出返回本地字符串作为切片(