MST

星途 面试题库

面试题:Rust结构体生命周期嵌套与泛型的深度融合

实现一个通用的`Container`结构体,它可以嵌套多种不同类型的`Item`结构体,每个`Item`结构体可能持有不同生命周期的引用。`Container`需要支持动态添加和移除`Item`,并且在添加和移除过程中保证所有的生命周期安全。同时,`Container`需要有一个方法能够遍历所有的`Item`并执行特定操作,该操作可能会涉及到`Item`中引用数据的修改。请详细阐述设计思路,并完整实现相关代码,包括正确的生命周期和泛型标注。
32.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. Container结构体:使用Vec来存储Item,以便支持动态添加和移除。
  2. Item结构体:可以是不同类型,且可能持有不同生命周期的引用。
  3. 生命周期标注:确保ContainerItem中的引用生命周期正确,特别是在添加、移除和遍历操作时。
  4. 泛型:使用泛型来支持不同类型的Item

代码实现

// 定义Item trait,所有的Item类型都要实现这个trait
trait ItemTrait {
    fn perform_operation(&mut self);
}

// 定义Container结构体
struct Container<T: ItemTrait> {
    items: Vec<T>,
}

impl<T: ItemTrait> Container<T> {
    // 添加Item的方法
    fn add_item(&mut self, item: T) {
        self.items.push(item);
    }

    // 移除Item的方法
    fn remove_item(&mut self, index: usize) {
        if index < self.items.len() {
            self.items.remove(index);
        }
    }

    // 遍历所有Item并执行特定操作的方法
    fn traverse_and_operate(&mut self) {
        for item in &mut self.items {
            item.perform_operation();
        }
    }
}

// 示例Item结构体
struct ExampleItem<'a> {
    data: &'a mut i32,
}

impl<'a> ItemTrait for ExampleItem<'a> {
    fn perform_operation(&mut self) {
        *self.data += 1;
    }
}

使用示例

fn main() {
    let mut num = 10;
    let mut container = Container { items: Vec::new() };
    let item = ExampleItem { data: &mut num };
    container.add_item(item);
    container.traverse_and_operate();
    println!("The value of num after operation: {}", num);
    container.remove_item(0);
}