4.5.3.4 引用来源
3 分钟阅读
译文 · 基于 Learning Rust
引用来源
原文链接: https://quinedot.github.io/rust-learning/dyn-elision-citations.html
最后我们将所涵盖的 dyn Trait 生命周期省略与当前参考材料对比,并提供省略曲折历史的一些引用。
与参考手册的差异摘要
trait 对象生命周期省略的官方文档可在此找到。
总之,它说明 dyn Trait 生命周期有默认对象生命周期约束,随上下文变化。仅当生命周期被完全省略时默认约束才生效。写出 dyn Trait + '_ 时,适用普通生命周期省略规则。
截至本文写作时,官方文档说明:
若 trait 对象用作泛型类型的类型参数,则首先用包含类型尝试推断约束。
- 若包含类型有唯一约束,则为默认
- 若包含类型有多个约束,必须指定显式约束
若以上规则都不适用,则使用 trait 上的约束:
- 若 trait 定义有单个生命周期约束,则使用该约束。
- 若任何生命周期约束使用
'static,则使用'static。- 若 trait 没有生命周期约束,则在表达式中推断生命周期,表达式外为
'static。
我们与参考手册涵盖的一些差异:
- 表达式中推断约束适用于
&T类型,除非用命名生命周期注解 - 表达式中推断约束适用于歧义类型
- 当 trait 约束适用时,它们覆盖结构体约束,而非相反
'statictrait 约束总是适用- 否则 trait 约束是否适用取决于复杂的上下文规则
- 在
impl头、关联类型和函数体中总是适用 - 技术上在
static上下文中也适用,有些奇怪注意事项 - 在函数签名中是否适用取决于边界参数是晚绑定还是早绑定
- 在此上下文中单个参数可适用于有多个约束的 trait 约束,引入新的隐式生命周期约束
- 在
- trait 约束在函数体中覆盖
'_
其他未记录或文档不足的行为:
RFC、Issue 和 PR
trait 对象,尤其是 trait 对象生命周期省略,随时间经历大量演变。此处总结一些主要发展和 issue。
提醒:许多引用早于 dyn Trait 语法。 trait 对象过去在类型位置只写 Trait,而非 dyn Trait。
- RFC 0192 首次引入 trait 对象生命周期
- RFC 0599 首次引入默认 trait 对象生命周期(
dyn Trait生命周期省略) - RFC 1156 取代 RFC 0599(
dyn Trait生命周期省略) - PR 39305 非正式修改 RFC 1156,允许函数体内更多推断
- RFC 2093 定义
struct约束如何与dyn Trait生命周期省略交互 - Issue 47078 指出晚绑定影响
dyn Trait生命周期省略 - Issue 100270 指出类型别名在 RFC 2093
dyn Trait生命周期省略规则中优先 - Issue 115379 指出 GAT 中默认
dyn Trait生命周期不适用- Issue 151649 对不稳定类型
const同样 - Issue 151662 对不稳定 RTN 路径同样
- Issue 140710 对不稳定 trait 别名的相关问题
- Issue 141997 对不稳定 IAT 的相关问题
- Issue 151649 对不稳定类型
- PR 129543 旨在解决上述 issue 并使默认更一致
- 指出一些我可能遗漏的奇怪行为,并将改变默认 trait 对象生命周期的许多细节
- Issue 91302 提议调整默认省略规则(但相当沉寂)
- Reference issue 1407 是我创建的 issue,希望使参考手册在此主题上准确