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