面试题答案
一键面试// 假设引用类型是 String
struct Inner {
ref_field: String,
}
struct Outer {
inner: Inner,
}
// 定义一个新的结构体,用于返回与 Inner 结构体内部状态相关的数据
struct InnerState {
state: String,
}
// 在 impl 块中处理生命周期
impl Outer {
// 这里不需要显式生命周期参数,因为 Inner 结构体实例是 Outer 的一部分,
// 其生命周期和 Outer 一致
fn get_inner_state(&self) -> InnerState {
InnerState {
state: self.inner.ref_field.clone(),
}
}
}
- 生命周期处理:在这个例子中,
Outer
结构体拥有Inner
结构体的实例,Inner
结构体中的ref_field
是String
类型,它拥有所有权,不是引用类型,所以不需要额外的生命周期参数来处理悬空引用问题。 - 返回与 Inner 结构体内部状态相关的新结构体:在
get_inner_state
方法中,我们直接克隆Inner
结构体中ref_field
的值,创建一个新的InnerState
结构体返回。这样做避免了返回可能的悬空引用,因为InnerState
拥有自己独立的数据副本。
如果 Inner
结构体中的字段是真正的引用类型,比如 &str
,代码可能如下:
struct Inner<'a> {
ref_field: &'a str,
}
struct Outer<'a> {
inner: Inner<'a>,
}
struct InnerState {
state: String,
}
impl<'a> Outer<'a> {
fn get_inner_state(&self) -> InnerState {
InnerState {
state: self.inner.ref_field.to_string(),
}
}
}
在这个例子中,Inner
结构体的 ref_field
是 &str
类型,所以需要显式的生命周期参数 'a
。Outer
结构体也需要同样的生命周期参数 'a
,因为它包含 Inner<'a>
。在 get_inner_state
方法中,我们将 &str
转换为 String
,这样 InnerState
结构体就拥有了自己的数据,避免了悬空引用。