跳转到内容

第 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 类型签名时,不再会觉得它是一串需要死记硬背的符号,而能一眼拆出它是由哪几层类型构造器组合而成的,以及每一层的物理表示与安全约束分别是什么。

从第一节开始 →