MST

星途 面试题库

面试题:Rust链式方法调用中的泛型与生命周期

定义一个泛型结构体`Wrapper<T>`,它包含一个类型为`T`的成员变量`data`。实现一个链式方法`transform`,该方法接受一个闭包作为参数,闭包对`data`进行操作并返回一个新的值,新值的类型与`data`的类型相同。同时要处理好生命周期问题,确保代码在不同场景下(例如`data`是引用类型)都能正确编译和运行。请给出完整的代码实现,并解释其中涉及的生命周期标注。
40.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
struct Wrapper<T> {
    data: T,
}

impl<T> Wrapper<T> {
    fn transform<F>(self, f: F) -> Wrapper<T>
    where
        F: FnOnce(T) -> T,
    {
        Wrapper {
            data: f(self.data),
        }
    }
}

生命周期标注解释

在这段代码中,由于transform方法使用self来接收结构体实例,意味着会消耗当前实例。闭包F接受T类型的值,并返回T类型的值,整个过程不涉及引用,因此不需要显式的生命周期标注。如果data是引用类型,transform方法接受的闭包需要正确处理引用的生命周期。例如,如果data&'a T类型,闭包F需要接受并返回相同生命周期的引用&'a T,在这种情况下,impl块中需要对F添加生命周期约束F: FnOnce(&'a T) -> &'a T。但在本题的需求下,data类型是T,不涉及引用生命周期问题,所以代码简洁且无需显式生命周期标注。