我对多次浏览 Rust 文档的标记部分和关于子类型和方差的维基百科文章感到愚蠢,却没有提高我对生命周期子类型关系的理解。
我想我只是习惯了“典型的 OOP 风格”子关系,例如“Cat <: Animal”,意思是“Cat 是 Animal 的子类型”,其中“S 是 T 的子类型”意味着“任何术语 S 都可以安全在预期 T 类型术语的上下文中使用”。到目前为止,一切都很好。
但这如何适用于生命周期?现在在 Rust 中定义的方式显然是 (*)
(#1) 'a <: 'b <=> 生命周期 a 不长于生命周期 b。
你可能会想“当然就是这个意思!” 可能是因为 <: 看起来类似于小于运算符,或者可能是因为“sub”让您想到子集,而较短的寿命肯定是较长寿命的一个子集。但是,如果'a 不长于'b,'a 真的是'b的子类型吗?让我们尝试应用 Wikipedia 对子类型关系的定义:
(#2) 'a <: 'b <=> 生命周期 a 可以安全地用于预期生命周期 b 的上下文中。
我的问题是我无法调和这一点。你如何从#2 到#1?因为对我来说,这似乎是一个矛盾...如果您期望某物至少在 b 内还活着,并且您的某物的生命期 a 比 b 短,那么您显然不能在某物的生命期为 b 的情况下使用它是必需的,可以吗?只是我,还是我们把一生的子类型关系弄错了?
编辑:(*) 根据#rust
IRC 频道中的 Ms2ger,情况就是这样。它还符合Items
迭代器中使用的逆变生命周期标记的文档。
Edit2:ConvariantLifetime 和 CovariantLifetime 标记已被删除。我们现在在标记模块中有PhantomData
一个替代品。