MST

星途 面试题库

面试题:Rust 集合所有权转移与生命周期及泛型的深度探讨

编写一个泛型函数,该函数接收两个不同类型集合(假设为`Vec<T>`和`Vec<U>`),并且这两个集合中的元素类型`T`和`U`都实现了`Clone` trait。函数需要将两个集合的元素合并到一个新的`Vec`中,新`Vec`的元素类型是一个包含`T`和`U`的元组。在函数实现过程中,要考虑所有权的合理转移和生命周期问题,避免出现悬空引用或内存泄漏。请详细阐述你的设计思路,包括如何处理所有权、生命周期以及泛型约束,并给出完整的代码实现。
28.5万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 所有权处理
    • 由于输入的Vec<T>Vec<U>在合并后不需要保留原始集合,所以可以直接将它们的所有权转移到新的处理逻辑中。这样可以避免不必要的克隆操作,提高效率。
  2. 生命周期处理
    • 这里不需要显式处理生命周期,因为新生成的Vec<(T, U)>中的元素是新创建的元组,它们的生命周期从创建开始,到Vec被销毁结束,不存在悬空引用的问题。
  3. 泛型约束
    • 函数接收的两个集合元素类型TU都需要实现Clone trait,这是因为在创建元组时需要克隆元素。如果不克隆,原始集合的所有权被转移后,新的元组会引用已释放的内存,导致悬空引用。

代码实现

fn merge_sets<T, U>(vec1: Vec<T>, vec2: Vec<U>) -> Vec<(T, U)>
where
    T: Clone,
    U: Clone,
{
    let mut result = Vec::new();
    let min_len = std::cmp::min(vec1.len(), vec2.len());
    for i in 0..min_len {
        result.push((vec1[i].clone(), vec2[i].clone()));
    }
    result
}

在上述代码中:

  1. 定义了一个泛型函数merge_sets,接收两个不同类型的Vec,即vec1vec2
  2. 通过where子句约束TU都要实现Clone trait。
  3. 计算两个集合长度的最小值,以避免越界访问。
  4. 使用for循环遍历较短的集合长度,将vec1vec2对应位置的元素克隆后组成元组,添加到结果Vec中。
  5. 最后返回合并后的Vec<(T, U)>