这是一个非常深入且核心的 Rust 概念(虽然在其他类型系统中也存在,但在 Rust 中尤为重要)。这两个概念解释了为什么有些代码可以通过编译,而有些看似合理的代码却会被借用检查器(Borrow Checker)拒绝。 简单来说: 1. 生命周期子类型化(Lifetime Subtyping):定义了生命周期之间的长短关系(谁能替代谁)。 2. 变变性(Variance):定义了当生命周期或类型作为参数组合成更复杂的类型(如 或 )时,这种子类型关系是如何传递(或不传递)的。 --- 1. 生命周期子类型化 (Lifetime Subtyping) 在面向对象编程中,如果 是 的子类,那么在需要 的地方,你可以传入 。这叫里氏替换原则。 在 Rust 中,生命周期也有这种关系: 规则:如果生命周期 比生命周期 活得更长(即 包含 ),那么 就是 的子类型。 语法:(读作: outlives )。 为什么长的是子类型? 因为子类型必须能替代父类型。 如果一个函数需要一个活 5 秒的引用()。 你给它一个活 10 秒的引用()。 这是安全的,因为 10 秒 > 5 秒。 所以, 可以...