先看一个简单的struct定义:
struct Point2D {
x: f64,
y: f64,
}
在没有实现fmt::Display或fmt::Debug这两个trait(在Rust语言中叫特性,类似Java接口中的抽象方法)的情况下,是无法对其使用println!直接输出的。
先介绍通过impl来实现fmt::Display:
impl fmt::Display for Point2D {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Display: {} + {}", self.x, self.y)
}
}
这是使用 println!("{}", Point2D{x: 3.3, y: 7.2}); 就会输出 Display: 3.3 + 7.2
而在Rust语言中实现Debug有两种方式,一种就是用推导#[derive(Debug)],另一种就是类似Display的impl方式。
先看推导,就是在struct上面加上#[derive(Debug)]
#[derive(Debug)]
struct Point2D {
x: f64,
y: f64,
}
这样就可以使用 println!("{:?}", Point2D{x: 3.3, y: 7.2}); 输出得到结果 Point2D { x: 3.3, y: 7.2 } 。但也可以看出,使用#[derive(Debug)]方式输出的结果样式是固定的,当需要换个花样来显示的时候,就要用到第二种方式impl fmt::Debug
下面实现 Debug 输出:Debug: Complex { x: 3.3, y: 7.2 }
impl fmt::Debug for Point2D {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Debug: Complex {{ x: {}, y: {} }}", self.x, self.y)
}
}
这里要注意,由于{}是占位符,想把{}作为原始字符输出的时候需要用两个连着,类似转义。