MST

星途 面试题库

面试题:Rust数组底层存储与生命周期关联

考虑一个函数,它接收一个Rust数组的引用并返回一个新的数组切片。在这个过程中,Rust的借用检查器如何确保数组底层存储的有效性和生命周期的正确性?请通过代码示例详细解释。
44.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
fn slice_array(arr: &[i32]) -> &[i32] {
    &arr[1..3]
}

fn main() {
    let original = [1, 2, 3, 4, 5];
    let result = slice_array(&original);
    println!("{:?}", result);
}
  1. 借用规则
    • Rust的借用检查器遵循三条主要规则:
      • 同一时间内,要么只能有一个可变引用(写操作),要么只能有多个不可变引用(读操作)。
      • 引用必须总是有效的。
  2. 代码分析
    • slice_array 函数中,参数 arr 是对 [i32] 数组的不可变引用。
    • 当返回 &arr[1..3] 时,借用检查器确保返回的切片的生命周期不会超过 arr 的生命周期。因为 arr 是函数参数,它的生命周期由调用者决定。
    • main 函数中,original 数组创建在栈上,当调用 slice_array(&original) 时,original 的引用被传递给函数。返回的切片 result 的生命周期依赖于 original,只要 original 存在,result 就是有效的。
    • 如果在函数内尝试对 arr 进行可变操作同时又返回切片,借用检查器会报错,因为这违反了借用规则(同时存在可变和不可变引用)。例如:
fn slice_array(arr: &[i32]) -> &[i32] {
    // 以下代码会报错,因为尝试对不可变引用进行可变操作
    let mut new_arr = arr.to_vec();
    new_arr.push(6);
    &new_arr[1..3]
}

这个修改后的代码会报错,因为 arr 是不可变引用,不能转换为可变的 new_arr 同时还返回切片。借用检查器通过这些规则确保了数组底层存储的有效性和生命周期的正确性。