MST

星途 面试题库

面试题:Rust引用与函数指针结合时的生命周期管理

假设有一个结构体`MyStruct`,其内部包含一个引用和一个函数指针,函数指针会使用到这个引用。请设计这个结构体,并编写相应的方法来确保引用的生命周期与函数指针的使用相匹配,同时说明在不同场景下生命周期标注的要点。
22.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
// 定义结构体
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
}

生命周期标注要点

  1. 结构体定义:在结构体定义 MyStruct<'a> 中,声明了生命周期参数 'a。这个生命周期参数用于标注结构体内部引用 my_ref 和函数指针 my_func 的生命周期,确保它们具有相同的生命周期。
  2. 函数指针类型:函数指针类型 Box<dyn Fn(&'a i32) -> i32 + 'a> 不仅标注了函数接受的参数引用具有 'a 生命周期,还标注了函数本身也具有 'a 生命周期。这是为了确保函数指针在其生命周期内不会使用到已经失效的引用。
  3. 方法实现:在 new 方法中,参数 my_refmy_func 都标注了相同的生命周期 'a,保证传递进来的引用和函数指针的生命周期相匹配。在 call_func 方法中,由于方法的接收者 &self 本身就包含了 my_refmy_func,且它们生命周期已经在结构体定义时确定,所以不需要额外的生命周期标注。

不同场景下,如果 MyStruct 的实例被传递到其他函数或者存储在不同的数据结构中,要确保 'a 生命周期在整个使用过程中是有效的。例如,如果将 MyStruct 存储在一个 Vec 中,Vec 的生命周期也需要和 'a 相匹配,或者在函数调用时,传入的引用和函数指针的生命周期要满足 MyStruct 的定义。