MST

星途 面试题库

面试题:Rust结构体定义与初始化:生命周期与泛型

定义一个泛型结构体`Container`,它有一个字段用于存储值,另一个字段是一个闭包,闭包的作用是对存储的值进行某种操作(操作由闭包定义)。该结构体的初始化函数需要正确处理生命周期问题,确保闭包在使用存储值时,值的生命周期足够长。请编写完整的结构体定义及初始化函数,并对可能涉及的生命周期标注进行详细说明。
21.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
// 定义泛型结构体Container
struct Container<'a, T> {
    value: T,
    operation: Box<dyn Fn(&'a T) -> () + 'a>,
}

// 初始化函数
impl<'a, T> Container<'a, T> {
    fn new(value: T, operation: impl Fn(&'a T) -> () + 'a) -> Self {
        Container {
            value,
            operation: Box::new(operation),
        }
    }
}

生命周期标注说明

  1. 'a:这是一个生命周期参数,在结构体定义Container<'a, T>中使用。它被用于标注闭包operation,表明闭包内部使用的对T类型值的引用(即&'a T)的生命周期是'a。这意味着闭包operation在其整个生命周期内,所引用的值的生命周期必须至少为'a
  2. impl<'a, T>:在实现块中也使用了相同的生命周期参数'a,以确保结构体实现中的所有操作都与结构体定义中的生命周期要求一致。
  3. new函数:在new函数的参数列表中,operation: impl Fn(&'a T) -> () + 'a,这个参数要求传入的闭包接受一个生命周期为'a的对T类型值的引用,并且闭包自身的生命周期也是'a。这样能保证闭包在使用value时,value的生命周期足够长。Box::new(operation)将闭包装箱,以满足operation字段的Box<dyn Fn(&'a T) -> () + 'a>类型要求。