面试题答案
一键面试示例代码
struct Inner {
data: Vec<String>,
}
struct Container {
inner: Inner,
}
// 应用生命周期省略规则的函数
fn process_container(container: &Container) -> &Vec<String> {
&container.inner.data
}
确保生命周期正确性及省略规则工作原理
-
生命周期正确性:在Rust中,每个引用都有一个生命周期。在这个例子中,
process_container
函数接受一个&Container
引用,返回一个&Vec<String>
引用。&Vec<String>
引用的生命周期不能长于&Container
引用的生命周期,因为&Vec<String>
引用的数据是Container
结构体内部Inner
结构体的一部分。如果process_container
函数返回的引用生命周期长于传入的Container
引用生命周期,那么就会产生悬空引用,导致内存不安全。 -
省略规则工作原理:Rust的生命周期省略规则适用于函数参数和返回值。在函数参数中,如果只有一个引用参数,那么这个引用的生命周期被假定为与函数调用的生命周期相同。如果有多个引用参数,第一个引用参数的生命周期被假定为与函数调用的生命周期相同,其他引用参数的生命周期是独立的。在返回值中,如果返回值是一个引用,并且函数参数中有一个引用的生命周期与返回值的生命周期相关,那么返回值的生命周期被假定为与这个相关的引用参数的生命周期相同。在
process_container
函数中,只有一个参数container: &Container
,并且返回值&Vec<String>
的生命周期与container
的生命周期相关,所以可以应用生命周期省略规则,编译器能够推断出正确的生命周期关系,确保代码的内存安全性。