Box<closure>和closure有什么不同?

问题描述 投票:0回答:1
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.

我的问题:

  1. 第二段代码中的闭包类型是什么?

  2. 为什么第一个代码中由 Box 指针包裹的闭包与第二个代码中单独的闭包不同?

  3. 关闭后如何使用x?正确的方法是?

rust closures box
1个回答
0
投票
  1. 第二段代码中的闭包类型是什么?

    如 Rust 参考章节中关于 闭包类型 中所述:

    闭包表达式生成一个闭包值,该值具有无法写出的唯一匿名类型。

  2. 为什么第一个代码中由 Box 指针包裹的闭包与第二个代码中单独的闭包不同?

    两个闭包都专门借用

    x
    。 只要它们存在,就无法从其他地方访问
    x

    在 Rust v1.63 之前,两个闭包都保持活动状态,直到词法作用域结束为止——导致它们对

    x
    的借用也会继续超出您的
    println!
    语句。 然而,由于非词汇生命周期,Rust 现在能够确定
    closure
    在最后一次使用后可以被删除。

    除了在

    Box
    情况下,
    closure
    需要销毁:
    Box
    有一个
    Drop
    处理程序(释放其堆分配)。 Rust 保证 when 析构函数将运行——在本例中,在词法作用域的末尾——因此无法更快地隐式删除
    closure

  3. 关闭后如何使用x?正确的方法是?

    使用完

    closure
    后,您可以明确
    drop(closure);
    。 然后,它对
    x
    的独占借用将结束,允许您此后再次使用
    x

© www.soinside.com 2019 - 2024. All rights reserved.