面试题答案
一键面试- 不可变借用的生命周期与结构体及函数作用域的关系:
- 不可变借用的生命周期从借用开始,到最后一次使用该借用的地方结束。
- 当对结构体进行不可变借用时,借用的生命周期不能超过结构体本身的生命周期,同时也受限于函数的作用域。在函数内对结构体进行不可变借用,该借用在函数结束时就会失效。
- 函数内部创建新引用指向结构体中切片的生命周期:
- 新引用的生命周期同样受限于函数的作用域以及结构体的生命周期。只要结构体存在且借用有效,新引用就可以正常使用。当函数结束,新引用超出作用域而失效。
以下是代码示例:
struct MyStruct {
data: Vec<String>,
}
fn print_data(s: &MyStruct) {
// 创建一个新的引用指向结构体中的切片
let slice_ref: &[String] = &s.data;
for item in slice_ref {
println!("{}", item);
}
// 这里 slice_ref 仍然有效
} // 函数结束,s 和 slice_ref 都超出作用域而失效
fn main() {
let my_struct = MyStruct {
data: vec!["hello".to_string(), "world".to_string()],
};
print_data(&my_struct);
// 这里 my_struct 仍然有效
}
在上述代码中,print_data
函数对 MyStruct
进行不可变借用,函数内创建的 slice_ref
引用的生命周期与不可变借用 s
的生命周期相关联,且都在函数结束时失效。而 my_struct
的生命周期在 main
函数结束时才失效。