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

Trait Bound

用真实编译验证 trait bound:泛型里用 > 而没有约束报 E0369(并建议 PartialOrd);加约束后 i32/f64/char/&str/String 都能用,不满足的类型报 E0277;多个约束与 where;impl<T: Display + PartialOrd> 里的方法只对满足约束的类型存在(E0599);add<T> 单态化出两份机器码。

Rust Trait Bound 泛型 单态化 真实验证 动画演示
Rust 内部机制 2026-10-02

impl Trait 参数与返回值

用真实编译验证 impl Trait:参数位置等价于匿名泛型(机器码被 LLVM 合并);返回位置隐藏具体类型但只能返回一种(E0308,可改 Box<dyn>);返回值借用参数时 edition 2021 报 E0700、2024 默认捕获通过;impl Trait 参数不能 turbofish(E0107)。

Rust impl Trait 泛型 edition 真实验证 动画演示
Rust 内部机制 2026-10-02

Trait Object 与动态分发

用真实运行与汇编验证 trait object:Vec<Box<dyn Shape>> 运行时按类型分发;dyn 不能直接放栈上(E0277),&dyn / Box<dyn> 是 16 字节胖指针;用 transmute 读出数据指针与 vtable 指针,同类型共用 vtable,vtable 里能读出 size/align(8/8、40/8、0/1);&dyn 版本只生成 1 个函数而泛型生成 2 个。

Rust Trait Object 动态分发 vtable 真实验证 动画演示
Rust 内部机制 2026-10-02

泛型单态化

用真实编译验证单态化:一个泛型函数用在 8 种类型上生成 8 个函数符号;.o 体积随类型数从 2,568 增长到 9,792 字节(&dyn 版从 6,248 到 9,120);编译时间从 45 ms 增到 84 ms。

Rust 泛型 单态化 代码体积 编译时间 真实验证 动画演示
Rust 内部机制 2026-10-02

静态分发与动态分发性能对比

用真实基准比较静态分发与动态分发:100 万对象每个约 0.90 ns(静态)、0.93 ns(dyn 全是同一类型)、2.30 ns(规律交替)、5.06 ns(随机类型);enum 分发约 0.86 ns;汇编上 dyn 调用是 ldr + br 一次间接跳转而静态调用可内联。

Rust 静态分发 动态分发 性能 真实验证 动画演示
Rust 内部机制 2026-10-02

dyn Trait 的对象安全

用真实编译验证哪些 trait 不能做成 dyn Trait(现在叫 dyn compatible,E0038):泛型方法、返回 Self、没有 self 的关联函数、supertrait 带 Sized(Clone);用 where Self: Sized 排除个别方法使其余部分仍可做成对象;用 box_clone 变通克隆 trait 对象。

Rust Trait Object dyn兼容 对象安全 真实验证 动画演示
Rust 内部机制 2026-10-02

Associated Type

用真实编译验证关联类型:type Item 由实现者确定;与泛型参数 trait 的区别(后者可多次实现但调用要消歧 E0283,前者一个类型只能实现一次 E0119);Iterator<Item = u32>、I::Item: Debug、Add<Output = T> 的约束写法;标准库里的 Item、Target、Output 用 type_name 打印验证。

Rust 关联类型 Trait 泛型 真实验证 动画演示
Rust 内部机制 2026-10-02

Generic Associated Type

用真实编译验证 GAT:标准 Iterator 无法表达借自自身的 Item(报错说明);用 type Item<'a> 写出借出式迭代器 WindowsMut(重叠的可修改窗口,最终数据 [1, 3, 6, 10]);带类型参数的 GAT 抽象容器族;漏写 where Self: 'a 的报错。

Rust GAT 泛型关联类型 借出式迭代器 真实验证 动画演示
Rust 内部机制 2026-10-02

Supertrait

用真实编译验证 supertrait:trait Pretty: Display 的默认方法可以用 Display、缺 Display 报 E0277;泛型约束只写子 trait 即包含所有 supertrait 的方法;trait 对象向上转型(&dyn Person → &dyn Named、Box 同理)在 rustc 1.98 可用;两个 supertrait 同名方法的 E0034 与消歧。

Rust Supertrait Trait trait upcasting 真实验证 动画演示
Rust 内部机制 2026-10-02

默认 Trait 方法

用真实运行验证 trait 的默认方法:只实现 Iterator::next 就获得 collect、map、filter、sum、zip、fold 等;覆盖默认 count_all 让 next_value 调用从 1001 次降到 0 次;PartialEq 只需 eq;两个互相依赖的默认方法都不覆盖会在运行时栈溢出(退出码 -6);通过 dyn 调用时覆盖版与默认版按类型选择。

Rust Trait 默认方法 Iterator 真实验证 动画演示
Rust 内部机制 2026-10-02

Trait 实现冲突与孤儿规则

用真实编译验证孤儿规则与一致性:六种 trait/类型组合(Display for Vec<u8> 报 E0117,From<Local> for Vec<u8>、Display for Box<Local> 通过,Display for Vec<Local> 报 E0117);blanket 实现与具体实现冲突 E0119;上游将来可能添加实现的提示;newtype 与自定义 trait 两种绕开办法。

Rust 孤儿规则 一致性 Trait E0117 E0119 真实验证 动画演示
Rust 内部机制 2026-10-02

Blanket Implementation

用真实编译验证 blanket impl:impl<T: Display> Loud for T 使所有 Display 类型获得 loud(),不满足报 E0599;标准库的 Display → ToString、From → Into(反过来没有,E0308);扩展 trait 给 &str/String/Cow 加方法;为 &T 与 Box<T> 补充转发实现。

Rust Blanket Implementation Trait 扩展trait 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号