struct Inner {
data: String,
}
struct Container<'a> {
items: Vec<&'a Inner>,
}
impl<'a> Container<'a> {
fn new() -> Self {
Container { items: Vec::new() }
}
fn add_item(&mut self, item: &'a Inner) {
self.items.push(item);
}
}
fn main() {
let inner1 = Inner { data: "Hello".to_string() };
let mut container = Container::new();
container.add_item(&inner1);
for item in container.items.iter() {
println!("{}", item.data);
}
}
生命周期标注和管理逻辑说明
- 结构体
Container
的生命周期标注:
- 在
struct Container<'a>
中,声明了一个生命周期参数'a
。这个'a
表示Container
中Vec<&'a Inner>
里引用的生命周期。
- 这意味着
Container
实例的生命周期不能超过它所包含的任何Inner
实例的生命周期。
add_item
方法:
fn add_item(&mut self, item: &'a Inner)
方法接受一个&'a Inner
类型的引用。这里的'a
生命周期参数与Container
结构体上声明的'a
是同一个,确保添加到Container
中的引用与Container
本身的生命周期要求一致。
- 这样就保证了
Container
中的引用不会指向一个已经被释放的Inner
实例,从而避免了悬空引用和生命周期错误。
main
函数:
- 创建了一个
Inner
实例inner1
。
- 创建了一个
Container
实例container
,并通过add_item
方法将inner1
的引用添加到container
中。
- 最后遍历
container
中的items
,打印出Inner
实例中的data
。整个过程中,inner1
的生命周期覆盖了container
使用其引用的时间段,符合生命周期规则。