【发布时间】:2014-10-13 23:35:31
【问题描述】:
我多次浏览了 Rust 文档的 marker section 和关于 subtyping 和 variance 的维基百科文章,却没有提高我对生命周期子类型关系的理解,我感到很愚蠢。
我想我只是习惯了“典型的 OOP 风格”子关系,例如“Cat <: animal t s>
但这如何适用于生命周期?现在在 Rust 中定义的方式显然是(*)
(#1) 'a <:> 生命周期 a 不长于生命周期 b。
你可能会想“当然就是这个意思!”可能是因为 <:>子类型吗?让我们尝试应用 Wikipedia 对子类型关系的定义:
(#2) 'a <:> 生命周期 a 可以安全地用于预期生命周期 b 的上下文中。
我的问题是我无法协调这一点。你如何从#2 到#1?因为对我来说,这似乎是一个矛盾...如果您期望某物至少在 b 内还活着,并且您的某物的生命期 a 比 b 短,那么您显然不能在某物的生命期为 b 的情况下使用它是必需的,可以吗?是我一个人,还是我们把一生的子类型关系弄错了?
编辑:(*) 根据 #rust IRC 频道中的 Ms2ger 所说,情况就是这样。它还符合在 Items 迭代器中使用的逆变生命周期标记的文档。
Edit2:ConvariantLifetime 和 CovariantLifetime 标记已被移除。我们现在在 marker 模块中替换了 PhantomData。
【问题讨论】:
-
Rust 的生命周期概念的灵感来自另一种称为 Cyclone 的编程语言及其类似的区域概念。 Region-Based Memory Management in Cyclone 的第 2.3 节讨论了区域子类型化,可能会有所帮助!我相信
a <: b <=> lifetime b is no longer than lifetime a。 -
我认为this 讨论可能有用。
-
@mwhittaker:如果你没记错的话,这将与 Rust 中为生命周期定义“子类型”的方式相反。
-
@sellibitze,我认为你是对的! Rust 和 Cyclone 中子类型的定义似乎是相反的。这是我之前链接的论文的摘录,它使 Cyclone 的子类型规则相当明确:“我们观察到,如果对应于
p1的区域比对应于p2的区域寿命长,那么使用@987654333 类型的值是合理的@ 我们期望*p2" 类型之一 -
链接的 GitHub 问题的解决方案是,“生命周期不是类型,因此没有子类型顺序;但是,它们确实有一个由区域包含给出的顺序。”