知其然,知其所以然
Rust 内部机制 2026-10-02

Rust 项目从 cargo new 到编译运行

真实运行 cargo new / build / run / check / build --release:生成的 5 样东西、第一次编译 0.23 s 与无变化重编 0.02 s、target/debug 里的结构、debug 438,120 字节 vs release 433,792 字节、cargo check 比 build 快多少。

Rust Cargo 编译 真实验证 动画演示
Rust 内部机制 2026-10-02

rustc、Cargo 与 Rustup 的关系

在没有装 rustup 的机器上验证三者的分工:rustc(rustc 1.98.1 (48a229cea 2026-09-01) (Homebrew),LLVM 22.1.8)是编译器,cargo 通过 cargo build -v 可见的 rustc 命令行调用它,sysroot 里只有宿主平台的标准库(rustc 认识 330 个目标),RUSTC 环境变量决定 cargo 用哪个 rustc。

Rust rustc Cargo Rustup 真实验证 动画演示
Rust 内部机制 2026-10-02

变量默认不可变

用真实的 rustc 1.98 报错验证「变量默认不可变」:重复赋值 E0384、字段赋值 E0594、对不可变 Vec 调用 push E0596、延迟初始化的合法与非法形式;并用汇编证明 let 与 let mut 写出的函数机器码完全相同(LLVM 直接合并成别名)。

Rust 不可变 mut 编译错误 真实验证 动画演示
Rust 内部机制 2026-10-02

Shadowing 与 mut 的区别

shadowing 与 mut 的四个真实差别:shadowing 能换类型而 mut 报 E0308、作用域只到块结束、debug 下是不同的地址(新变量)、被遮蔽的值要到作用域结束才按相反顺序 drop(遮蔽不会提前释放资源)。

Rust Shadowing mut Drop 真实验证 动画演示
Rust 内部机制 2026-10-02

基本类型与类型推断

用真实运行验证基本类型:各整数/浮点/bool/char/() 的字节数与范围;没有标注时的默认类型(i32、f64);类型推断来自后文使用,信息不足报 E0284;整数溢出在 debug 下 panic、release 下回绕及四种显式写法;as 转换的截断与饱和规则。

Rust 基本类型 类型推断 整数溢出 真实验证 动画演示
Rust 内部机制 2026-10-02

数组、切片与 Vec

真实运行验证数组、切片与 Vec:数组 20 字节在栈上、越界在编译期或运行时被拦截;&[T] 是 16 字节的胖指针、一个函数同时接受数组、Vec 与它们的子范围;Vec 本身 24 字节、容量按 4→8→16→32→64 翻倍;栈与堆地址对比;get 返回 Option。

Rust 数组 切片 Vec 真实验证 动画演示
Rust 内部机制 2026-10-02

Tuple、Struct 与 Enum

用真实运行验证 Tuple、Struct、Enum:元组解构与 () 占 0 字节;结构体更新语法;默认布局会重排字段(u8,u32,u8 只占 8 字节而 repr(C) 占 12);枚举大小 = 最大变体 + 标签(Shape 24 字节),Option<u8>/<u32>/<f64> 是 2/8/16 字节;变体字段不能直接访问(E0609)。

Rust Tuple Struct Enum 内存布局 真实验证 动画演示
Rust 内部机制 2026-10-02

match 穷尽匹配

用真实的 rustc 报错验证 match 的穷尽性:漏变体报 E0004 并给出修复;字面量、范围、守卫、@ 绑定等模式;新增枚举变体时显式 match 报错而 _ 通配悄悄通过;分支类型不一致 E0308;u8 漏掉 255 也被发现。

Rust match 模式匹配 枚举 真实验证 动画演示
Rust 内部机制 2026-10-02

if let 与 let else

用真实编译验证 if let、while let、let else:let chains;let else 的 else 块必须发散(E0308)、成功时绑定留在外层;普通 let 用可失败模式报 E0005、if let 用必然匹配的模式只警告;同一份代码在 edition 2021 与 2024 下,if let 条件里临时值的释放顺序不同。

Rust if let let else edition 真实验证 动画演示
Rust 内部机制 2026-10-02

Option 与 Result

用真实运行验证 Option 与 Result:两个普通枚举(可自己实现);没有 null,Option<i32> + 1 报 E0369;unwrap_or、map、and_then、ok_or、? 的行为;expect 的 panic 信息;Option<&T>、Option<Box<T>>、Option<String> 没有额外内存开销而 Option<u64> 是 16 字节。

Rust Option Result niche优化 真实验证 动画演示
Rust 内部机制 2026-10-02

derive 自动生成 Trait 实现

用真实编译验证 derive:没有 derive 的结构体不能 {:?}(E0277)、不能 clone(E0599);derive 之后的输出;用 -Z unpretty=expanded 展开看到的 Debug/Clone/PartialEq 实际代码;Copy 要求字段全是 Copy(E0204)、PartialOrd 的字典序;泛型 derive 自动加 T: Trait 约束。

Rust derive Trait 宏展开 真实验证 动画演示
Rust 内部机制 2026-10-02

Newtype 模式

用真实编译验证 newtype:type 别名不创建新类型(参数写反不报错,算出 0.0958),newtype 报 E0308 并建议交换参数;newtype 与 f64 同为 8 字节且机器码相同;用 newtype 绕过孤儿规则 E0117 实现 Display;用 Deref 转发内部类型的方法。

Rust Newtype 类型安全 孤儿规则 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号