MST

星途 面试题库

面试题:Rust嵌套作用域下复杂生命周期约束

考虑以下Rust代码场景:有一个结构体 `Container`,它包含一个 `Vec<String>` 成员。在一个嵌套作用域内,我们希望从 `Container` 中获取一个特定索引位置的字符串切片,并在外部作用域使用。同时,`Container` 可能在内部作用域结束前被修改(例如删除某个元素)。请编写代码实现这个功能,并正确处理所有相关的生命周期问题。要求使用生命周期标注和必要的借用检查机制,防止出现悬空指针或未定义行为。代码框架如下: ```rust struct Container { data: Vec<String> } fn main() { let mut container = Container { data: vec![ String::from("item1"), String::from("item2"), String::from("item3") ] }; { // 在此处编写获取特定索引位置字符串切片的逻辑,并正确处理生命周期 } // 在外部作用域使用获取到的字符串切片(假设之前获取的是索引为1的元素) } ```
31.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
struct Container {
    data: Vec<String>
}

fn main() {
    let mut container = Container {
        data: vec![
            String::from("item1"),
            String::from("item2"),
            String::from("item3")
        ]
    };
    let borrowed_str;
    {
        if let Some(s) = container.data.get(1) {
            borrowed_str = s;
        } else {
            return;
        }
        container.data.remove(0);
    }
    println!("The string at index 1 was: {}", borrowed_str);
}

解释:

  1. 在内部作用域,使用 get 方法获取 Vec<String> 中索引为1的元素。get 方法返回一个 Option<&String>,这样可以在获取失败(索引越界)时优雅处理。
  2. 将获取到的 &String 赋值给外部作用域定义的 borrowed_str
  3. 由于 get 返回的是一个引用,所以生命周期是自动管理的,符合借用检查机制。在获取引用后,Container 可以被修改,例如删除第一个元素 container.data.remove(0),只要不影响到 borrowed_str 的生命周期即可。
  4. 在外部作用域使用 borrowed_str。如果 get 操作失败,直接从 main 函数返回,避免未定义行为。