MST

星途 面试题库

面试题:Rust不可变借用的生命周期与作用域

假设你有一个结构体包含一个字符串切片,并且在一个函数中对该结构体进行不可变借用。请详细阐述不可变借用的生命周期是如何与结构体及函数作用域相互关联的。若在函数内部创建一个新的引用指向结构体中的切片,这个新引用的生命周期又该如何确定?请用代码示例辅助说明。
32.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 不可变借用的生命周期与结构体及函数作用域的关系
    • 不可变借用的生命周期从借用开始,到最后一次使用该借用的地方结束。
    • 当对结构体进行不可变借用时,借用的生命周期不能超过结构体本身的生命周期,同时也受限于函数的作用域。在函数内对结构体进行不可变借用,该借用在函数结束时就会失效。
  2. 函数内部创建新引用指向结构体中切片的生命周期
    • 新引用的生命周期同样受限于函数的作用域以及结构体的生命周期。只要结构体存在且借用有效,新引用就可以正常使用。当函数结束,新引用超出作用域而失效。

以下是代码示例:

struct MyStruct {
    data: Vec<String>,
}

fn print_data(s: &MyStruct) {
    // 创建一个新的引用指向结构体中的切片
    let slice_ref: &[String] = &s.data;
    for item in slice_ref {
        println!("{}", item);
    }
    // 这里 slice_ref 仍然有效
} // 函数结束,s 和 slice_ref 都超出作用域而失效

fn main() {
    let my_struct = MyStruct {
        data: vec!["hello".to_string(), "world".to_string()],
    };
    print_data(&my_struct);
    // 这里 my_struct 仍然有效
}

在上述代码中,print_data 函数对 MyStruct 进行不可变借用,函数内创建的 slice_ref 引用的生命周期与不可变借用 s 的生命周期相关联,且都在函数结束时失效。而 my_struct 的生命周期在 main 函数结束时才失效。