MST

星途 面试题库

面试题:Rust集合在复杂数据结构中的生命周期关联

假设有一个结构体`Container`,它包含一个`Vec`,而`Vec`中的元素是指向其他结构体实例的引用。例如:`struct Inner { data: String }; struct Container { items: Vec<&Inner> };`。如何正确管理这些引用和集合的生命周期,以避免悬空引用或生命周期错误?写出完整代码并详细说明生命周期标注和管理逻辑。
48.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
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);
    }
}

生命周期标注和管理逻辑说明

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