面试题答案
一键面试// 定义结构体C
struct C {
data: i32,
}
// 定义结构体B,持有结构体C的引用
struct B<'a> {
c_ref: &'a C,
}
// 定义结构体A,持有结构体B的引用
struct A<'a> {
b_ref: &'a B<'a>,
}
// 函数,接受结构体C的引用并返回结构体B
fn create_b<'a>(c: &'a C) -> B<'a> {
B { c_ref: c }
}
// 函数,接受结构体B的引用并返回结构体A
fn create_a<'a>(b: &'a B<'a>) -> A<'a> {
A { b_ref: b }
}
fn main() {
let c = C { data: 42 };
let b = create_b(&c);
let a = create_a(&b);
// 使用结构体A中的数据
println!("A has a reference to B which has a reference to C with data: {}", a.b_ref.c_ref.data);
}
在上述代码中:
C
是一个普通结构体,不涉及生命周期参数。B
结构体持有C
的引用,通过生命周期参数'a
表明其引用的C
的生命周期。A
结构体持有B
的引用,同样通过生命周期参数'a
表明其引用的B
的生命周期,且B
引用的C
的生命周期也由'a
决定。create_b
函数接受C
的引用并返回B
,确保返回的B
中引用的C
的生命周期与传入的C
的生命周期一致。create_a
函数接受B
的引用并返回A
,确保返回的A
中引用的B
的生命周期与传入的B
的生命周期一致。
通过这种子类型化生命周期的方式,Rust 编译器可以确保内存安全,避免悬空指针等问题。