Rust实现fmt::Display和fmt::Debug对struct进行格式化输出

先看一个简单的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)
    }
}

这里要注意,由于{}是占位符,想把{}作为原始字符输出的时候需要用两个连着,类似转义。

本博客采用 知识共享署名-禁止演绎 4.0 国际许可协议 进行许可

本文标题:Rust实现fmt::Display和fmt::Debug对struct进行格式化输出

本文地址:https://jizhong.plus/post/2017/12/rust-display-and-debug.html