// 定义一个结构体,包含一个引用类型的字段,'a 是生命周期参数
struct MyStruct<'a> {
data: &'a i32,
}
// 定义一个函数,接受一个 MyStruct 实例并打印其字段的值
fn print_data(s: &MyStruct<'_>) {
println!("The value is: {}", s.data);
}
fn main() {
let num = 42;
// 创建 MyStruct 实例,生命周期与 num 相关联
let my_struct = MyStruct { data: &num };
print_data(&my_struct);
}
生命周期参数作用及标注说明
- 作用:生命周期参数(这里是
'a
)用于告知编译器,结构体中引用类型字段(data
)的生命周期与其他数据(在 main
函数中是 num
)的生命周期之间的关系。它确保在结构体的整个生命周期内,引用始终指向有效的内存,避免悬垂引用(dangling reference)问题,从而保证内存安全。
- 标注:
- 在结构体定义
struct MyStruct<'a> { data: &'a i32, }
中,<'a>
声明了一个生命周期参数 'a
,并将其应用于 data
字段,表示 data
引用的 i32
值的生命周期至少与 'a
一样长。
- 在函数
print_data(s: &MyStruct<'_>)
中,使用了 '_
语法,这是一种生命周期省略的写法,它根据函数签名和 Rust 的生命周期推断规则,编译器可以推断出正确的生命周期。在这种情况下,它与 print_data(s: &MyStruct<'a>)
等效,其中 'a
是 MyStruct
实例传入时的生命周期。在 main
函数中创建 MyStruct
实例时,data
引用的 num
的生命周期决定了 my_struct
的生命周期,从而也满足了 print_data
函数对 MyStruct
实例生命周期的要求。