面试题答案
一键面试- 定义嵌套结构体:
假设我们有两个结构体
Inner
和Outer
,Outer
包含Inner
。struct Inner<'a> { data: &'a i32, } struct Outer<'a> { inner: Inner<'a>, other_data: &'a i32, }
- 为结构体方法添加生命周期参数:
为
Inner
和Outer
结构体添加方法,这些方法需要访问其他结构体中的数据。impl<'a> Inner<'a> { fn access_outer_data(&self, outer: &Outer<'a>) -> i32 { *self.data + *outer.other_data } } impl<'a> Outer<'a> { fn access_inner_data(&self) -> i32 { *self.inner.data } }
- 考虑不同结构体之间生命周期关系:
- 在这个例子中,
Inner
结构体持有对i32
数据的引用data
,这个引用的生命周期为'a
。Outer
结构体不仅持有Inner
实例,还持有另一个i32
数据的引用other_data
,其生命周期同样为'a
。 - 对于
Inner
的access_outer_data
方法,它接受一个Outer
结构体的引用,因为Inner
中data
引用的生命周期为'a
,所以Outer
结构体的生命周期也必须为'a
,这样才能保证在access_outer_data
方法调用时,Inner
中的data
引用和Outer
中的other_data
引用都有效。 - 对于
Outer
的access_inner_data
方法,由于Outer
持有Inner
,并且Inner
中的data
引用的生命周期与Outer
结构体的生命周期一致(都为'a
),所以在调用access_inner_data
方法时,Inner
中的data
引用是有效的。
- 在这个例子中,
通过明确指定生命周期参数 'a
,并在结构体和方法定义中保持一致,确保了内存安全,避免了悬空引用等问题。