Ziglings 笔记 36: 有数值的枚举与格式化

颜色的数字

在 Ziglings 的第 36 个练习中,枚举不再只是抽象的标签,它们变成了具体的数据。

在 C 语言中,枚举本质上就是 int。但在 Zig 中,枚举默认是不透明的。不过,我们可以显式地把它们绑定到某种整数类型上,这在定义像 CSS 颜色这样的常量集时非常方便。

挑战:定义蓝色与 HTML 输出

任务有两个:

  1. 定义 Color 枚举中 blue 的十六进制值。
  2. 将三个颜色值格式化为 HTML 字符串输出。

解决方案

这是补充完整的代码:

const std = @import("std");

// 1. 指定枚举的底层类型为 u32
// 这样我们就可以给成员赋大数值了 (Hex 颜色代码)
const Color = enum(u32) {
    red = 0xff0000,
    green = 0x00ff00,
    
    // 2. 定义纯蓝色
    // 十六进制表示:R=00, G=00, B=FF
    blue = 0x0000ff,
};

pub fn main() void {
    std.debug.print(
        \\<p>
        \\  <span style="color: #{x:0>6}">Red</span>
        \\  <span style="color: #{x:0>6}">Green</span>
        \\  <span style="color: #{x:0>6}">Blue</span>
        \\</p>
        \\
    , .{
        @intFromEnum(Color.red),
        @intFromEnum(Color.green),
        
        // 3. 别忘了把枚举转回整数
        @intFromEnum(Color.blue),
    });
}

核心知识点总结

1. enum(u32)

通过 enum(type) 语法,我们控制了枚举在内存中的大小和它可以持有的值。这让枚举不仅能表示状态,还能作为配置常量的集合。

2. @intFromEnum

Zig 是强类型的。即使我们定义了 Color 背后是 u32,我们也不能直接把 Color.red 当作数字去加减乘除。必须通过内置函数 @intFromEnum 进行“去壳”,取出里面的整数。

3. 格式化魔法 {x:0>6}

这个练习展示了 Zig 强大的格式化能力,专门用于生成像 HTML 颜色代码这样的字符串:

  • x: 转成小写十六进制。
  • 0>6: 宽度为 6,不足补 0,右对齐。 如果不加这个格式化,蓝色 0xff 就会被打印成 #ff,而不是标准的 #0000ff,这会导致 CSS 解析错误。

后续预告:枚举和结构体是构建数据的基石。下一篇,我们将正式进入 Structs (结构体) 的章节,学习如何将不同类型的数据组合在一起。