我必须将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…
很糟糕。
您是否有更方便的方法或有关如何处理它的任何建议?
答案 0 :(得分:12)
故意不容易: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
if你真的需要String
)。
答案 1 :(得分:7)
正如mcarton所说的并不那么简单,并非所有路径都是UTF-8编码的。但你可以使用:
p.into_os_string().into_string()
要对它进行精细控制。通过?
,您可以将错误发送到较高级别,或者只是忽略它unwrap()
:
let my_str = cwd.into_os_string().into_string().unwrap();
关于into_string()
的美妙之处在于错误包装了原始的OsString
值。
答案 2 :(得分:5)
将PathBuf转换为String的一种方法是:
your_path.as_path().display().to_string();