How to Print Rust Structs/Enums

在Rust中定义结构体(struct)或枚举(enum)类型时,可以在定义前加上属性#[derive(Debug)]。这样可以让编译器为该类型自动派生(derive)出std::fmt::Debug trait的实现。然后在打印时使用{:?}则可以打印出变量类型的数据表示。

注意的是,如果你希望用{}打印结构体或者枚举变量,你还是需要为其实现std::fmt::Display trait

另外,如果你的结构体中还包含了别的结构体,你可能还是需要自己实现std::fmt::Debug trait来达到自己希望的打印效果。例如在下例(Rust Playground传送门)中,Deep(Structure(7))会打印出Deep(Structure(7)),而Flat(Structure(7))则会通过自定义的实现打出Structure(7)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
use std::fmt;
#[derive(Debug)]
struct Structure(i32);
#[derive(Debug)]
struct Deep(Structure);
struct Flat(Structure);
impl fmt::Debug for Flat {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
Flat(Structure(num)) => write!(f, "Structure({})", num),
}
}
}
fn main() {
println!("Structure {:?}: ", Structure(3));
println!("Deep {:?}: ", Deep(Structure(7)));
println!("Flat {:?}: ", Flat(Structure(7)));
}