数据结构
本章介绍 Auto 如何使用 type、enum 和 spec 来组织数据,以及它们如何映射到 C 的 struct、union、typedef 和函数指针模式。你将构建真实的数据结构,并了解 Auto 的 设计如何防止常见错误。
31. 结构体
C 使用 struct 将相关字段组合在一起:
struct Point {
int x;
int y;
};
struct Point p = {3, 4};Auto 使用 type 定义结构体。字段以逗号分隔,构造函数使用命名初始化:
Auto 的 Point(3, 4) 转译为 C 的 (struct Point){.x = 3, .y = 4},使用 指定初始化器。方法如 Point.modulus() 在 C 中变为独立函数 Point_Modulus(struct Point *self)。
32. 联合体
C 联合体允许不同类型共享同一块内存:
union Value {
int i;
float f;
};普通的 C 联合体是不安全的——没有标签来指示哪个变体是活动的。Auto 的 enum 创建带标签的联合体,同时携带标签和值:
在 C 中,enum Shape 变为一个包含 tag 字段和 union as 字段的结构体。 is 表达式转译为对标签的 switch 语句。
33. Typedef 与 Auto type
C 使用 typedef 创建类型别名:
typedef int UserId;
typedef float Score;Auto 的 type 携带单个字段时可以达到相同效果,无需 typedef 关键字:
Auto 的包装类型比 C 的 typedef 更具表达力,因为它们创建不同的类型——你不会 意外地将 UserId 传递给需要普通 int 的地方。
34. 位域
C 允许指定结构体字段的位宽:
struct Flags {
unsigned int is_active : 1;
unsigned int priority : 3;
};位域是 C 独有的特性,用于内存受限的环境。Auto 不提供位域。请使用 bool 和 int 字段代替;编译器会在可能的情况下进行优化。
35. 枚举
C 的 enum 赋予整数常量:
enum Color { RED, GREEN, BLUE };
enum Color c = GREEN;Auto 的 enum(无负载时)映射到 C 的 enum,使用 NAME_VARIANT 前缀 避免名称冲突:
enum Color { RED, GREEN, BLUE }变为:
enum Color { COLOR_RED, COLOR_GREEN, COLOR_BLUE };36. 链表
链表是一种基础数据结构。每个节点保存一个值和指向下一个节点的引用。Auto 的 ?T 可选类型自然地表示"下一个或无"的链接。
在 C 中,?Node 变为 struct Node*(可为空的指针)。nil 字面量映射为 NULL。
37. 栈与队列
栈是一种后进先出(LIFO)数据结构。用数组和一个顶部索引来实现。
队列会使用两个索引(前端和后端)或环形缓冲区。原理相同:将数组封装在 type 中并提供 push/pop 方法。
38. 哈希表
简单的哈希表使用桶数组和一个哈希函数。在 C 中,你需要为哈希和相等性策略 使用函数指针。在 Auto 中,spec 系统可以优雅地实现这一点:
spec Hasher {
fn hash(key str) int
}每个桶可以是链表(用于冲突链接)。完整实现超出了本章范围,但模式遵循与 第 2 章函数指针相同的 spec + type 方法。
39. C 中的 OOP 与 Auto 的 spec/type
C 没有类,但可以用结构体和函数指针模拟面向对象编程。Auto 的 spec 和 type 系统使这种方式变得惯用且类型安全。
spec Drawable 在 C 中生成一个包含函数指针的虚表结构体。每个实现的类型 (CircleObj、SquareObj)获得一个虚表实例和具体的方法函数。
40. 练习:图书管理系统
使用类型、方法和状态管理构建一个小型图书管理系统。
这个练习结合了 type 定义、方法、状态修改和条件逻辑——本章所有概念的 综合运用。
快速参考
| 概念 | Auto | C |
|---|---|---|
| 结构体 | type Name { fields } | struct Name { fields }; |
| 构造函数 | Name(v1, v2) | (struct Name){.f1=v1, .f2=v2} |
| 方法 | fn Name.method() | void Name_method(struct Name *self) |
| 标签联合 | enum Tag { Variant fields } | struct Tag { tag; union as; } |
| 类型别名 | type Name BaseType | typedef BaseType Name; |
| 枚举 | enum Color { RED } | enum Color { COLOR_RED }; |
| 可选类型 | ?T | T*(可为空) |
| 链表节点 | type Node { val, ?Node } | struct Node { val; Node* next; } |
| 接口 | spec Name { fn ... } | 带函数指针的虚表 |
| 实现 | type Foo as Spec { } | 虚表实例 + 方法 |
| 空值 | nil | NULL |
| 字段访问 | self.field | self->field |