面试题答案
一键面试生命周期协同工作阐述
- 闭包生命周期:闭包捕获环境中的变量,并将这些变量的生命周期延长到闭包的生命周期内。在这种情况下,闭包捕获了
MyStruct
的可变引用,因此MyStruct
的生命周期至少要和闭包的生命周期一样长。 - 函数参数生命周期:函数
modify_struct
接受MyStruct
的可变引用,这意味着函数调用期间MyStruct
必须保持有效。由于闭包在函数内部调用并修改MyStruct
,MyStruct
的生命周期必须覆盖函数调用和闭包执行的时间。因此,MyStruct
的生命周期要长于函数调用和闭包执行的时间。
代码示例
struct MyStruct {
data: String,
}
fn modify_struct(s: &mut MyStruct, f: impl FnOnce(&mut String)) {
f(&mut s.data);
}
fn main() {
let mut my_struct = MyStruct { data: "initial".to_string() };
modify_struct(&mut my_struct, |s| {
s.push_str(" modified");
});
println!("{}", my_struct.data);
}
在上述代码中,modify_struct
函数接受MyStruct
的可变引用和一个闭包。闭包对MyStruct
中的String
成员变量进行修改。my_struct
的生命周期覆盖了函数调用和闭包执行的时间,确保闭包可以安全地修改MyStruct
中的数据。