rust - 什么时候需要使闭包变量可变?

标签 rust closures

<分区>

为什么我需要让这个闭包变量可变?闭包不返回任何内容,因此没有任何内容存储在闭包变量中。此闭包仅从环境中捕获一个值并递增它。

fn main() {
    let mut x = 1;
    let mut y = || x = x + 1;
    y();
    println!("{}", x);
}

最佳答案

本质上,这是 Rust 健全性规则之一的结果——您不能通过对可变引用的共享引用来修改任何内容。您的引用链中的所有引用都需要可变才能实现这一点。

让我们使用结构将示例中的闭包翻译成大致等效的代码:

struct Closure<'a> {
    x: &'a mut i32,
}

impl Closure<'_> {
    fn call(&mut self) {
        *self.x += 1;
    }
}

闭包通过可变引用捕获x——它必须能够修改它。当闭包被调用时,它通过可变引用接收 self——它必须能够通过 self 指针改变 x

现在如果你想调用这个闭包,你还需要让它可变:

let mut x = 1;
let mut y = Closure { x: &mut x };
y.call();

如果不使 y 可变,则不能将对 y 的可变引用传递给 call() 方法。

开头提到的稳健性规则的原因很容易看出:如果你可以通过对可变引用的共享引用进行变异,那么编写多个玩家对同一内存位置持有可变引用的代码就很容易了,这违反了有关 Rust 引用的基本规则之一。

关于rust - 什么时候需要使闭包变量可变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59270277/

相关文章:

ios - 从 swift 调用 objective-C typedef block

php - 闭包重载 : is it possible to inspect the number of arguments a PHP closure has without executing it?

xml - 使用serde序列化结构时,如何展平 `Vec`字段?

closures - 函数类型与闭包类型

rust - 正确解析 Clap ArgMatches 的惯用使用rust 方法

reference - 当函数需要引用闭包参数时,如何将函数用作闭包?

javascript - 在外部范围访问变量?

unit-testing - 有没有某种方法可以构建包含测试文档字符串的 Rust 文档?

rust - 是否可以将元组结构构造函数传递给函数以返回不同类型的值?

ios - "res"代表什么?