gpt4 book ai didi

closures - 在 FnMut 闭包中改变由值捕获的 upvar

转载 作者:行者123 更新时间:2023-11-29 07:57:49 24 4
gpt4 key购买 nike

我正在尝试创建一个简单的程序,其中包含一个包含逐渐清空自身的集合的闭包:

fn main() {
let vector = vec![1, 2, 3];

let mut allow_once = move |i: &i32| -> bool {
if let Some(index) = vector.position_elem(i) {
vector.remove(index);
return true
}
false
};

for e in &[1, 2, 3, 1, 2, 3] {
let is_in = if allow_once(e) { "is" } else { "is not" };
println!("{} {} allowed", e, is_in);
}
}

这似乎是 kosher(对我来说),但 rustc 提示(每晚):

<anon>:6:13: 6:19 error: cannot borrow captured outer variable in an `FnMut` closure as mutable
<anon>:6 vector.remove(index);
^~~~~~

我预计问题可能与脱糖有关。也就是说,虽然实现从不违反别名 XOR 变异原则,但也许 desguaring 使得 rustc 没有意识到这一点。

因此:

  1. 这是临时限制/错误还是固有的?
  2. 如何尽可能高效地创建具有可变环境的闭包?

注意:通过引用捕获不是一个选项,我希望能够移动闭包。

最佳答案

其实这个问题很容易解决。只需将 mut 限定符添加到 vector 即可:

fn main() {
let mut vector = vec![1, 2, 3];

let mut allow_once = move |i: &i32| -> bool {
if let Some(index) = vector.position_elem(i) {
vector.remove(index);
true
} else { false }
};

for e in &[1, 2, 3, 1, 2, 3] {
let is_in = if allow_once(e) { "is" } else { "is not" };
println!("{} {} allowed", e, is_in);
}
}

(工作代码 here )

它只是和往常一样的可变性规则——为了改变某些东西,它必须在某处有mut,无论是在它的变量声明中还是在它的类型中(&mut ).

关于closures - 在 FnMut 闭包中改变由值捕获的 upvar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30053816/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com