第 3 章 一切皆类型
在第一篇中,我们已经顺着「唯一释放责任」推导出了所有权、移动与借用,并在变量声明、重新赋值和遮蔽的真实代码中核对了这套规则。
但只要你继续往下写 Rust,脑子里很快就会冒出一连串新的困惑:为什么同样占 8 个字节的地址,&i32 赋值是复制,&mut i32 赋值却变成了移动?为什么在 Java 或 Python 里只需要一个 List 或 String 就能应付的场景,到了 Rust 里却会冒出 &[i32]、Vec<i32>、Box<[i32]>、Option<&str> 等一大串看似复杂的类型签名?
这一章我们用三节课的时间,把整个第二篇最核心的底层视角立起来:
- 先看清在没有
class和运行时对象头的 Rust 里,物理表示、方法与安全约束是如何一并装进编译期类型实体、并在生成机器码时擦除的; - 再看清当你写下
User之后,&User、&mut User、[User; 4]、Vec<User>这些数不清的新类型,是如何由类型构造器在编译期按需合成出来的; - 最后看清为什么其他语言给的是打包焊死的「预制件」,而 Rust 把它们拆成了正交的构造器零件,并掌握从外向内剥洋葱拆读任意复杂嵌套类型的方法。
读完这一章,当你再看到任何一个复杂的 Rust 类型签名时,不再会觉得它是一串需要死记硬背的符号,而能一眼拆出它是由哪几层类型构造器组合而成的,以及每一层的物理表示与安全约束分别是什么。