Zig Academy · 课时

使用 @Type 构建类型

以编程方式构造新类型

第 2 / 4 课13 个步骤

使用 @Type 构建类型 是 CoddyKit 上的免费 Zig Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Zig Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Zig Academy 课程共包含 4 节课。

@typeInfo 的反向操作

如果 @typeInfo 将类型转换为数据,那么 @Type 就会将数据转换回真正的类型。二者结合后,您可以在编译时重新塑造类型。🛠️

传入 Type.Info 值

@Type 接收一个 std.builtin.Type 值,并生成它所描述的具体类型。您提供描述,它返回类型。

const T = @Type(.{ .Int = .{ .signedness = .unsigned, .bits = 8 } });

构建整数类型

上面的示例从头构造了 u8。将 bits 改为 16,就会得到 u16;这一切都会在程序编译时决定。

const U16 = @Type(.{ .Int = .{ .signedness = .unsigned, .bits = 16 } });

往返转换类型

将类型传入 @typeInfo,再通过 @Type 返回的仍是完全相同的类型。这证明这两个内建函数互为精确逆运算。

const Same = @Type(@typeInfo(u32));

将结构体描述为数据

要构建结构体,您需要填充一个 结构体字段数组。每个字段都需要名称、类型、对齐方式和默认值指针。

const f = std.builtin.Type.StructField;

组装结构体载荷

将字段包装在带有布局和 is_tuple 标志的 .Struct 载荷中,然后将整个载荷传给 @Type。

const info = .{ .Struct = .{
    .layout = .auto,
    .fields = my_fields,
    .decls = &.{},
    .is_tuple = false,
} };

生成全新的结构体类型

对该载荷调用 @Type,即可获得一个全新的结构体类型。它由您自己的逻辑构建,而不是手动编写。

const Generated = @Type(info);

默认值需要编译期指针

字段的默认值是一个可选的、指向该值的常量指针;如果没有默认值,则为 null。该指针必须在编译期已知。

const dv: ?*const anyopaque = &@as(u8, 0);

构建枚举及其他类型

同样的技巧不仅适用于结构体:.Enum 载荷可以让 @Type 根据计算出的成员列表合成枚举类型。

为什么要构造类型

生成的类型可以为序列化器和对象关系映射器提供支持:您可以自动派生紧凑的配置类型或行类型,而不必手动编辑。✨

结合反射使用

最强大的模式是使用 @typeInfo 读取类型,转换数据,然后使用 @Type 重新构建新类型,例如添加字段。

快速检查

您有一个描述结构体的 std.builtin.Type 值。什么操作可以将它转换为可用的类型?

回顾

@Type 根据 Type.Info 数据构建真实类型,是 @typeInfo 的逆运算。将二者结合起来,即可读取、转换并重新生成类型。🎯

免费开始

用 AI 导师学习 Zig — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
30
课程
120

常见问题解答

「使用 @Type 构建类型」课时是免费的吗?

是的 — 「使用 @Type 构建类型」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Zig Academy 课程的其余内容,请升级到 CoddyKit PRO。 Zig Academy 课程共包含 4 节课。

「使用 @Type 构建类型」这节课中我会学到什么?

以编程方式构造新类型 你通过在浏览器中直接运行的动手代码来练习 Zig Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Zig Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Zig Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「使用 @Type 构建类型」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Zig Academy 课中编写并运行代码吗?

能。每节 Zig Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 @typeInfo 反射字段
  2. 使用 @Type 构建类型
  3. 编译时验证与 @compileError
  4. 使用 comptime 生成代码
← 返回 Zig Academy