1-2
显示 (Display)
rust
复制代码
// 动手试一试
use std::fmt;
#[derive(Debug)]
struct Complex {
real: f64,
imag: f64,
} impl fmt::Display for Complex {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{} + {}i", self.real, self.imag)
}
}
fn main() {
let complex = Complex {
real: 3.3,
imag: -7.2,
};
println!("Display: {}", complex);
println!("Debug: {:?}", complex);
}
bash
复制代码
要点1 :Display fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {}
要点2 :write!:将格式化后的数据写入到 Formatter
要点3 :最后一行不写分号默认为返回值
要点4 :Result 是一种用于错误的枚举类型 操作的结果 -> 成功 或 失败
测试实例: List
rust
复制代码
//动手试一试
use std::fmt;
struct List(Vec<i32>);
impl fmt::Display for List {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
// 使用元组的下标获取值,并创建一个 `vec` 的引用。
let vec = &self.0;
write!(f, "[")?;
for (index, value) in vec.iter().enumerate() {
if index != 0 {
write!(f, ", ")?;
}
write!(f, "{}: {}", index, value)?;
}
write!(f, "]")
}
}
fn main() {
let v = List(vec![1, 2, 3]);
println!("{}", v);
}
rust
复制代码
要点1 : ? 用于传播错误给调用者
要点2 : for (index, value) in vec.iter().enumerate() 是一种常见用法 index 是 usize value 是 &i32
要点3 : 一般描述嵌套类型 例如 元组结构体 最外层的就是最本质的, 名字最后的也是最本质的
格式化
rust
复制代码
// 动手试一试
use std::fmt::{self, Formatter, Display};
struct Color {
red: u8,
green: u8,
blue: u8,
}
impl Display for Color {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
let hex = format!("{:02X}{:02X}{:02X}", self.red, self.green, self.blue);
write!(f, "RGB ({}, {}, {}) 0x{}", self.red, self.green, self.blue, hex)
}
}
fn main() {
for color in [
Color { red: 128, green: 255, blue: 90 },
Color { red: 0, green: 3, blue: 254 },
Color { red: 0, green: 0, blue: 0 },
].iter() {
println!("{}", *color);
}
}
bash
复制代码
要点1 : 格式化字符 X 为 大写十六进制数
要点2 : format!() 返回字符串
要点3 : 需要在循环体内 对color 进行解引用