Rust中引用的生命周期为何能长于其指向类型的生命周期?
问题解答
关于'b: 'a约束的合法性问题
你的直觉是完全正确的,'b: 'a这个约束本身不符合&'b Bytes<'a>类型的合法引用要求,你贴的代码实际上无法通过Rust稳定版编译器的编译,编译器会直接提示你需要将约束修改为'a: 'b才能符合规则。如果你确认代码可以正常编译,大概率是你书写时笔误调换了约束的两个生命周期参数,'a: 'b才是符合规则的可编译约束。
我们可以拆解下&'b Bytes<'a>的隐含约束:
- 引用的基础规则:
'b是对Bytes<'a>实例的引用的生命周期,必须短于等于被引用的Bytes<'a>实例的生命周期,否则会出现悬垂引用。 - 结构体的生命周期约束:
Bytes<'a>实例内部持有&'a [u8],因此Bytes<'a>实例的生命周期必须短于等于'a,否则内部的切片引用会失效。
把两个约束结合起来可以直接推导出:'b <= Bytes实例生命周期 <= 'a,也就是要求'a的生命周期至少和'b一样长,对应约束就是'a: 'b,和你认为的“应该是相反的约束关系”完全匹配。
关于返回值生命周期标注的问题
如果把约束修正为'a: 'b,返回值标注为'b是完全合法的,这是Rust生命周期协变特性的体现:更长生命周期的引用可以安全地缩窄为更短生命周期的引用使用。
你返回的&self.0[..2]本质上是结构体内部&'a [u8]的切片,自带'a的生命周期,由于约束保证了'a长于等于'b,我们可以安全地把这个引用的有效期缩短到和'b(也就是self引用的生命周期)一致。这个标注相当于向调用者保证:返回的切片的有效期和你传入的Bytes实例的引用的有效期完全绑定,只要你持有的Bytes引用有效,返回的切片就不会失效。
内容的提问来源于stack exchange,提问作者raj
相关产品推荐
相关产品推荐

