0Pricing
Zig Academy · 课时

泛型数据结构

掌握返回类型的函数模式。

泛型数据结构 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 接收类型的函数
  2. 泛型数据结构
  3. @TypeOf 与类型反射
  4. anytype 参数
← 返回 Zig Academy