《通过例子学Rust》为Color实现Display

2020-10-31  本文已影响0人  Gascognya
#[derive(Debug)]
struct Color {
    red: u8,
    green: u8,
    blue: u8,
}

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)
    }
}

动手试一试

为上面的 Color 结构体实现 fmt::Display,应得到如下的输出结果:

RGB (128, 255, 90) 0x80FF5A
RGB (0, 3, 254) 0x0003FE
RGB (0, 0, 0) 0x000000

重点在于最后16进制RGB码进制数的计算,这个16进制数实际上是按位拼合
11111111, 11111111, 111111113组0~255二进制数,拼合成FF FF FF

第一种方式是计算出这个数
let r = self.red as u32 * 0x10000;
let g = self.green as u32 * 0x100;
let b = self.blue as u32;
write!(f, "RGB ({}, {}, {}) 0x{:>06X}", self.red, self.green, self.blue, r + g + b)

注意,原本数字为u8,在此6位16进制数,相当于24位2进制数。我们选用32位无符号数来承载。先强转,再乘十六进制。注意在输出时,需要补0到6位

第二种为取巧
write!(f, "RGB ({0}, {1}, {2}) 0x{0:>02X}{1:>02X}{2:>02X}", self.red, self.green, self.blue)

我们不将其计算,而是单纯在视觉上用字符串拼接的方式组合出来。
注意R,G,B分为占2位,都需要补0到2位

trait 达成预期结果
上一篇 下一篇

猜你喜欢

热点阅读