let mut x = 10;
let mut closure: Box<dyn FnMut() -> i32> = Box::new(|| {
println!("x = {}", x);
x += 5;
x
});
let value1 = closure(); // x = 10
let value2 = closure(); // x = 15
let value3 = closure(); // x = 20
println!(
"value1 = {}, value2 = {}, value3 = {}",
value1, value2, value3
);
// println!("After closure call, x = {}", x); // error[E0502]: cannot borrow `x` as immutable because it is also borrowed as mutable
let mut x = 10;
let mut closure = || {
println!("x = {}", x);
x += 5;
x
};
let value1 = closure(); // x = 10
let value2 = closure(); // x = 15
let value3 = closure(); // x = 20
println!(
"value1 = {}, value2 = {}, value3 = {}",
value1, value2, value3
);
println!("After closure call, x = {}", x); // x is ok for printing.
我的问题:
第二段代码中的闭包类型是什么?
为什么第一个代码中由 Box 指针包裹的闭包与第二个代码中单独的闭包不同?
关闭后如何使用x?正确的方法是?
第二段代码中的闭包类型是什么?
如 Rust 参考章节中关于 闭包类型 中所述:
闭包表达式生成一个闭包值,该值具有无法写出的唯一匿名类型。
为什么第一个代码中由 Box 指针包裹的闭包与第二个代码中单独的闭包不同?
两个闭包都专门借用
x
。 只要它们存在,就无法从其他地方访问x
。
在 Rust v1.63 之前,两个闭包都保持活动状态,直到词法作用域结束为止——导致它们对
x
的借用也会继续超出您的 println!
语句。 然而,由于非词汇生命周期,Rust 现在能够确定 closure
在最后一次使用后可以被删除。
除了在
Box
情况下,closure
需要销毁:Box
有一个 Drop
处理程序(释放其堆分配)。 Rust 保证 when 析构函数将运行——在本例中,在词法作用域的末尾——因此无法更快地隐式删除 closure
。
关闭后如何使用x?正确的方法是?
使用完
closure
后,您可以明确 drop(closure);
。 然后,它对 x
的独占借用将结束,允许您此后再次使用 x
。