在Rust中打印路径

18

我应该如何在Rust中打印路径?

我尝试了以下代码以打印当前工作目录:

use std::os;

fn main() {
    let p = os::getcwd();
    println!("{}", p);
}

但是rustc返回以下错误:

[wei2912@localhost rust-basics]$ rustc ls.rs 
ls.rs:5:17: 5:18 error: failed to find an implementation of trait core::fmt::Show for std::path::posix::Path
ls.rs:5     println!("{}", p);
                           ^
note: in expansion of format_args!
<std macros>:2:23: 2:77 note: expansion site
<std macros>:1:1: 3:2 note: in expansion of println!
ls.rs:5:2: 5:20 note: expansion site

PathBuf没有实现std::fmt::Display。 - milahu
3个回答

33
正如你所发现的,打印Path的“正确”方法是通过.display方法,它返回实现Display类型Path没有实现Display的原因是:将路径格式化为字符串是一项有损操作。并非所有操作系统都存储与UTF-8兼容的路径,并且格式化例程隐式地处理UTF-8数据而不是任意编码数据。
例如,在我的Linux系统上,值为255的单个字节是一个完全有效的文件名,但在UTF-8中这不是一个有效的字节。如果尝试将该Path打印到字符串中,则必须以某种方式处理无效数据:.display将使用替换字符U+FFFD替换无效的UTF-8字节序列,但此操作无法逆转。
总之,应该很少将Path处理为字符串,因此它们不实现Display以鼓励这种做法。

15
以下内容将打印出完整路径:
println!("{}", p.display());

请参考Path::display获取更多细节。


1
作为相关的话题,我写了一个库,当你“只想使用UTF-8”时可以使用stfu8
这个库使用转义字符(即\x00)来格式化任何几乎是UTF-8序列的方式,以便开发人员可以按照预期的方式进行操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接