面试题答案
一键面试// 定义结构体
struct MyStruct<'a> {
my_ref: &'a i32,
my_func: Box<dyn Fn(&'a i32) -> i32 + 'a>,
}
// 实现结构体方法
impl<'a> MyStruct<'a> {
fn new(my_ref: &'a i32, my_func: Box<dyn Fn(&'a i32) -> i32 + 'a>) -> Self {
MyStruct {
my_ref,
my_func,
}
}
fn call_func(&self) -> i32 {
(self.my_func)(self.my_ref)
}
}
// 示例函数
fn example_func(ref_val: &i32) -> i32 {
*ref_val * 2
}
生命周期标注要点
- 结构体定义:在结构体定义
MyStruct<'a>
中,声明了生命周期参数'a
。这个生命周期参数用于标注结构体内部引用my_ref
和函数指针my_func
的生命周期,确保它们具有相同的生命周期。 - 函数指针类型:函数指针类型
Box<dyn Fn(&'a i32) -> i32 + 'a>
不仅标注了函数接受的参数引用具有'a
生命周期,还标注了函数本身也具有'a
生命周期。这是为了确保函数指针在其生命周期内不会使用到已经失效的引用。 - 方法实现:在
new
方法中,参数my_ref
和my_func
都标注了相同的生命周期'a
,保证传递进来的引用和函数指针的生命周期相匹配。在call_func
方法中,由于方法的接收者&self
本身就包含了my_ref
和my_func
,且它们生命周期已经在结构体定义时确定,所以不需要额外的生命周期标注。
不同场景下,如果 MyStruct
的实例被传递到其他函数或者存储在不同的数据结构中,要确保 'a
生命周期在整个使用过程中是有效的。例如,如果将 MyStruct
存储在一个 Vec
中,Vec
的生命周期也需要和 'a
相匹配,或者在函数调用时,传入的引用和函数指针的生命周期要满足 MyStruct
的定义。