美文网首页
《通过例子学Rust》为Color实现Display

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

作者: Gascognya | 来源:发表于2020-10-31 00:13 被阅读0次
#[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)
  • Red乘以十六进制的0x10000,可以变为0xFF0000
  • Green乘以十六进制的0x100,可以变成0xFF00
  • Blue不变,为0xFF

注意,原本数字为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 达成预期结果

相关文章

网友评论

      本文标题:《通过例子学Rust》为Color实现Display

      本文链接:https://www.haomeiwen.com/subject/wtwjvktx.html