gpt4 book ai didi

rust - 使用可变迭代器迭代时对不可变借用执行操作

转载 作者:行者123 更新时间:2023-11-29 08:28:20 24 4
gpt4 key购买 nike

<分区>

这里用一个简单的人工例子来说明问题:

fn sum_slice(v: &[i32]) -> i32 {
v.iter().sum()
}

fn sum_previous(v: &mut [i32]) {
for (i, val) in v.iter_mut().enumerate() {
*val = sum_slice(&v[0..i]);
}
}

fn main() {
let mut v = vec![1,1,1,1,1,1,1];
sum_previous(&mut v);
println!("{:?}", v);
}

理想情况下,sum_previous 将采用提供的切片并将每个元素替换为之前元素的总和。

但这会产生错误:

    error[E0502]: cannot borrow `*v` as immutable because it is also borrowed as 
mutable

--> src/main.rs:7:27
|
6 | for (i, val) in v.iter_mut().enumerate() {
| ------------------------
| |
| mutable borrow occurs here
| mutable borrow later used here
7 | *val = sum_slice(&v[0..i]);
| ^ immutable borrow occurs here

Rust playground link

我理解 Rust 限制我们只能同时拥有一个可变引用和没有不可变引用的问题。我也可以提供不同的解决方案,例如使用另一个向量来存储结果,但问题不是如何解决它,而是这里可接受的模式是什么?

FWIW 最初的问题是元胞自动机的实现,其中要处理的网格和每个要根据其邻居更新的单元格。在这种情况下,网格是可变借用的,而计算更新的函数需要一个不可变的引用。

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