MST
星途 面试题库

面试题:Rust中复杂生命周期场景下的借用规则

在Rust中,假设你有一个结构体`Container`,它内部存储了一个动态大小的`Vec`,同时有一个方法`get_ref`返回内部`Vec`中某个元素的引用。在涉及多个`Container`实例及相关操作的复杂场景下,描述如何正确标注生命周期以避免借用检查错误,并给出简单示例代码。
33.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 生命周期标注原则
    • 当方法返回内部Vec中某个元素的引用时,返回引用的生命周期应与Container实例的生命周期相关联。
    • 因为VecContainer的一部分,Vec中元素的引用生命周期不能长于Container本身的生命周期。
  2. 示例代码
struct Container {
    data: Vec<i32>
}

impl Container {
    fn get_ref<'a>(&'a self, index: usize) -> Option<&'a i32> {
        self.data.get(index)
    }
}

fn main() {
    let c = Container { data: vec![1, 2, 3] };
    if let Some(ref value) = c.get_ref(1) {
        println!("Value at index 1: {}", value);
    }
}

在上述代码中:

  • <'a>是生命周期参数,它在get_ref方法定义中声明。
  • &'a self表示self(即Container实例)的引用具有生命周期'a
  • -> Option<&'a i32>表示返回的i32引用也具有生命周期'a,这确保了返回的引用不会比Container实例本身存活得更久,从而避免借用检查错误。