我必须将
PathBuf
变量转换为 String
才能满足我的功能。我的代码是这样的:
let cwd = env::current_dir().unwrap();
let my_str: String = cwd.as_os_str().to_str().unwrap().to_string();
println!("{:?}", my_str);
它可以工作,但与
cwd.as_os_str…
一起使用很糟糕。
您有更方便的方法或者有什么处理建议吗?
正如 mcarton 所说,事情并不那么简单,因为并非所有路径都是 UTF-8 编码。但你可以使用:
p.into_os_string().into_string()
为了对其进行精细控制,请利用
?
将错误发送到上层,或者通过调用 unwrap()
: 忽略它
let my_str = cwd.into_os_string().into_string().unwrap();
关于
into_string()
的一个好处是错误会覆盖原始 OsString
值。
故意这样做并不容易:
String
是UTF-8编码的,但PathBuf
可能不是(例如在Windows上)。所以转换可能会失败。
to_str
和 to_string_lossy
方法。前者返回 Option<&str>
来指示可能的失败,后者始终会成功,但会用 U+FFFD REPLACEMENT CHARACTER
替换非 UTF-8 字符(这就是它返回 Cow<str>
的原因:如果路径已经是有效的 UTF-8,它将返回对内部缓冲区的引用,但如果要替换某些字符,它将为此分配一个新的 String
;在这两种情况下,如果您确实需要 into_owned
,则可以使用
String
) .
将 PathBuf 转换为 String 的一种方法是:
your_path.as_path().display().to_string();
正如 @mcarton 提到的, to_string_lossy() 应该可以完成这项工作。
let cwd = env::current_dir().unwrap();
let path: String =String::from(cwd.to_string_lossy());
rustc 1.56.1 (59eed8a2a 2021-11-01)
我是一个(学习)Rust 粉丝(多年的 c/c++ 程序员)但是伙计,如果它让简单的事情变得如此复杂,UTF-8 和 COW.. 会让人们迷失在翻译中。