struct Inner {
data: String,
}
struct Outer {
inner: Inner,
}
fn get_str(outer: &Outer) -> &str {
&outer.inner.data
}
生命周期解释
- 参数
outer
:它的生命周期是调用者指定的,这里记为'a
。即outer: &'a Outer
。
- 返回值:返回值
&str
的生命周期也依赖于outer
,因为它指向outer
内部Inner
结构体中的String
。所以返回值是&'a str
。
- 整体函数签名:完整的函数签名为
fn get_str(outer: &'a Outer) -> &'a str
。这样就保证了返回的引用在outer
有效的期间一直有效。
Deref强制转换与生命周期规则的相互作用
- Deref强制转换:在Rust中,当我们编写
&outer.inner.data
时,实际上发生了Deref强制转换。outer
是&Outer
类型,outer.inner
通过Deref
强制转换从&Inner
类型获取Inner
结构体的成员data
。因为&Inner
实现了Deref<Target = Inner>
,所以可以通过.
操作符访问内部成员。
- 与生命周期规则的关系:Deref强制转换过程中,生命周期是保持一致的。由于
outer
的生命周期是'a
,outer.inner
的生命周期也自动继承为'a
(因为它是outer
的一部分),而&outer.inner.data
创建的&str
引用的生命周期同样是'a
。所以在整个过程中,生命周期规则保证了引用的有效性,Deref强制转换在这个过程中顺利进行,没有引入任何生命周期相关的错误。