<分区>
为什么我需要让这个闭包变量可变?闭包不返回任何内容,因此没有任何内容存储在闭包变量中。此闭包仅从环境中捕获一个值并递增它。
fn main() {
let mut x = 1;
let mut y = || x = x + 1;
y();
println!("{}", x);
}
<分区>
为什么我需要让这个闭包变量可变?闭包不返回任何内容,因此没有任何内容存储在闭包变量中。此闭包仅从环境中捕获一个值并递增它。
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/