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