MST
星途 面试题库

面试题:Rust中FnOnce trait在所有权转移场景下的深度理解

假设有一个结构体`MyStruct`,它内部包含一些资源(例如一个`Vec<i32>`)。现在要创建一个一次性闭包,这个闭包在调用时会将`MyStruct`实例的资源转移并进行处理(例如计算`Vec<i32>`中所有元素的和)。请详细写出代码实现,包括`MyStruct`的定义、闭包的创建、闭包作为参数传递给另一个函数以及如何处理闭包返回的结果。同时解释在这个过程中所有权是如何转移和管理的。
42.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
struct MyStruct {
    data: Vec<i32>,
}

fn process_with_closure(closure: impl FnOnce(MyStruct) -> i32) {
    let my_struct = MyStruct { data: vec![1, 2, 3] };
    let result = closure(my_struct);
    println!("The sum is: {}", result);
}

fn main() {
    let closure = |my_struct: MyStruct| {
        my_struct.data.iter().sum()
    };
    process_with_closure(closure);
}

所有权转移和管理解释

  1. MyStruct实例创建:在process_with_closure函数内部,创建了MyStruct实例my_struct,此时my_struct的所有权归属于process_with_closure函数。
  2. 闭包创建:在main函数中创建闭包closure,这个闭包捕获MyStruct实例并在其内部处理数据。由于闭包定义为FnOnce,意味着它在调用时会获取MyStruct实例的所有权。
  3. 闭包作为参数传递:将闭包closure传递给process_with_closure函数,在这个过程中,闭包的所有权被转移到process_with_closure函数中。
  4. 闭包调用:在process_with_closure函数内部调用闭包closure,此时MyStruct实例my_struct的所有权被转移到闭包中,闭包消耗my_struct并处理其内部的Vec<i32>数据。
  5. 结果处理:闭包返回计算结果(Vec<i32>中所有元素的和),该结果被process_with_closure函数中的result接收,最后打印结果。整个过程中,MyStruct实例的所有权随着闭包的传递和调用进行转移,最终在闭包调用后MyStruct实例被销毁。