先看一个需要实现Hex输出的struct:
struct Color {
red: u8,
green: u8,
blue: u8,
}
再看准备的数据:
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!("{} 0x{:X}", *color, color)
}
在Rust中要为struct实现一个格式化输出,只要实现对应的trait就可以了。在std中fmt::LowerHex和fmt::UpperHex可以用来输出16进制,分别对应的格式化符号是{:x}、{:X}。
顶部引入std::fmt库:
use std::fmt::{self, Formatter, Display, UpperHex};
实现Display和UpperHex特征:
impl Display for Color {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
write!(f, "RGB ({}, {}, {})", self.red, self.green, self.blue)
}
}
impl UpperHex for Color {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
write!(f, "{:02X}{:02X}{:02X}", self.red, self.green, self.blue)
}
}
结果:
RGB (128, 255, 90) 0x80FF5A
RGB (0, 3, 254) 0x0003FE
RGB (0, 0, 0) 0x000000
关于Display的实现就不再重复说了,有专门写过关于它的故事《Rust实现fmt::Display和fmt::Debug对struct进行格式化输出》。
这里说说UpperHex这个trait(特征)。UpperHex是为了按照大写的格式输出十六进制,用格式化符号{:X}来表示。{:02X}表示输出的长度为2,如果不足两位,则补0。