MST

星途 面试题库

面试题:Rust结构体生命周期初始化中的复杂借用关系

考虑以下代码: ```rust struct Data<'a> { value: &'a i32 } struct Container<'a> { data: Option<Data<'a>> } fn create_container() -> Container<'_> { let num = 42; // 请在这里正确初始化并返回Container实例 } ``` 请补全 `create_container` 函数,确保代码能够正确编译并符合Rust的生命周期规则,同时说明为什么要这样处理生命周期。
39.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
struct Data<'a> {
    value: &'a i32
}

struct Container<'a> {
    data: Option<Data<'a>>
}

fn create_container() -> Container<'static> {
    let num = 42;
    let data = Data { value: &num };
    Container { data: Some(data) }
}

为什么这样处理生命周期

  1. num 是在 create_container 函数内部创建的局部变量,其生命周期只在函数内部有效。
  2. 然而,函数 create_container 返回的 Container 实例需要包含一个指向 num 的引用。如果不特殊处理,这个引用在函数返回后指向的 num 就会超出作用域,导致悬垂指针问题。
  3. 通过将 num 设置为 'static 生命周期,意味着 num 的数据将在整个程序运行期间有效。这里 num 是一个字面值常量,其数据在编译时就确定,所以可以认为具有 'static 生命周期。
  4. 因此返回的 Container 实例的生命周期也设置为 'static,这使得返回的 Container 实例中的引用能够在函数外部安全使用,符合Rust的生命周期规则。