Ziglings 笔记 36: 有数值的枚举与格式化
颜色的数字
在 Ziglings 的第 36 个练习中,枚举不再只是抽象的标签,它们变成了具体的数据。
在 C 语言中,枚举本质上就是 int。但在 Zig 中,枚举默认是不透明的。不过,我们可以显式地把它们绑定到某种整数类型上,这在定义像 CSS 颜色这样的常量集时非常方便。
挑战:定义蓝色与 HTML 输出
任务有两个:
- 定义
Color枚举中blue的十六进制值。 - 将三个颜色值格式化为 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 (结构体) 的章节,学习如何将不同类型的数据组合在一起。