泛型数据结构
掌握返回类型的函数模式。
泛型数据结构 是 CoddyKit 上的免费 Zig Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Zig Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Zig Academy 课程共包含 4 节课。
Zig 中的泛型容器
要让数据结构适用于任意元素类型,您可以编写一个接受类型并返回全新结构体类型的函数。📦
返回类型的函数
关键在于,函数可以将 type 作为返回类型。它会在编译时计算并返回一个全新的类型。
fn List(comptime T: type) type {
return struct {};
}在内部构建结构体
在函数内部,定义一个字段使用类型参数 T 的结构体。每次调用都会生成一个针对该元素类型定制的结构体。
fn Box(comptime T: type) type {
return struct { value: T };
}为生成的类型命名
调用返回类型的函数,并将结果存储在一个 const 中。现在您就有了一个可以使用的具体类型。
const IntBox = Box(i32);创建一个实例
像使用任何结构体一样使用这个已命名的类型。在这里,我们创建一个存放整数四十二的 Box。
const b = IntBox{ .value = 42 };向内部结构体添加方法
返回的结构体也可以包含方法。这些方法能够看到类型参数,因此仍然是完全泛型的。
fn Box(comptime T: type) type {
return struct {
value: T,
fn get(self: @This()) T {
return self.value;
}
};
}使用 @This 获取类型
在匿名返回结构体内部无法直接为它命名,因此方法使用 @This() 来引用外层结构体类型。
self: @This()一个定义,多种类型
使用不同类型调用该函数,就会得到不同的结构体。Box(i32) 和 Box(f64) 是彼此独立且经过完整检查的类型。
const FloatBox = Box(f64);标准库正是以此为基础
Zig 自己的 ArrayList 和 HashMap 正是通过这种方式构建的:接受类型并返回配置好的容器类型的函数。
const Ints = std.ArrayList(i32);完全在编译时解析
所有这些类型构造都发生在构建期间,因此泛型容器的开销与手写容器相同。
扩容时携带分配器
会扩容的容器会存储一个 分配器 字段,并在初始化时传入,这样泛型类型就能明确说明其内存来源。
return struct {
items: []T,
alloc: std.mem.Allocator,
};快速检查
您想在 Zig 中实现一个适用于任意元素类型的泛型栈。应该使用什么模式?
回顾
编写一个接受类型并返回结构体类型的函数。每次调用都会生成一个具体的专门化容器。这就是标准库构建其集合的方式。🎯
常见问题解答
「泛型数据结构」课时是免费的吗?
是的 — 「泛型数据结构」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Zig Academy 课程的其余内容,请升级到 CoddyKit PRO。 Zig Academy 课程共包含 4 节课。
「泛型数据结构」这节课中我会学到什么?
掌握返回类型的函数模式。 你通过在浏览器中直接运行的动手代码来练习 Zig Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Zig Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Zig Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「泛型数据结构」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Zig Academy 课中编写并运行代码吗?
能。每节 Zig Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。