在Rust中打印路径

wei*_*912 7 rust

我怎么能在Rust中打印一条路径?

我尝试了以下方法来打印当前的工作目录:

use std::os;

fn main() {
    let p = os::getcwd();
    println!("{}", p);
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

huo*_*uon 18

正如您所发现的,打印a的"正确"方法Path是通过.display方法返回实现的类型Display.

有一个原因Path没有实现Display自己:格式化字符串的路径是一个有损操作.并非所有操作系统都存储与UTF-8兼容的路径,并且格式化例程隐含地仅处理UTF-8数据.

例如,在我的Linux系统上,值为255的单个字节是完全有效的文件名,但这不是UTF-8中的有效字节.如果您尝试将其打印Path到字符串,则必须以某种方式处理无效数据:.display将使用替换字符U + FFFD替换无效的UTF-8字节序列,但此操作无法撤消.

总而言之,Paths应该很少被处理,就像它们是字符串一样,因此它们不会实现Display鼓励它.


wei*_*912 8

以下将打印出完整路径:

println!("{}", p.display());
Run Code Online (Sandbox Code Playgroud)

请参阅Path::display更多详细信息.