gpt4 book ai didi

rust - Double for循环可变引用

转载 作者:行者123 更新时间:2023-12-03 11:42:17 25 4
gpt4 key购买 nike

我想使用双For循环将每个元素与每个元素进行比较,如果这些属性相同,请对对象进行更改。下面是我想要做的一些演示代码。
但是Rust编译器在这里告诉我,我不能从同一对象获得2个可变引用。我如何以不同的方式实现整个事情?

fn main() {
struct S {
a: i32
}
let mut v = vec![S{a: 1}, S{a: 1}, S{a: 1}];

let size = v.len();
for i in 0..size {
for j in 0..size {
if i == j {
continue;
}

let a = &mut v[i];
let b = &mut v[j];

if a.a == b.a {
a.a = 5;
}
}
}
}
安慰:
error[E0499]: cannot borrow `v` as mutable more than once at a time
--> src\main.rs:35:26
|
34 | let a = &mut v[i];
| - first mutable borrow occurs here
35 | let b = &mut v[j];
| ^ second mutable borrow occurs here
36 |
37 | if a.a == b.a {
| --- first borrow later used here

最佳答案

首先要注意的是,您只需要突变v[i],就不需要两个可变引用。
这样写会创建两个不可变的借位,并且在if内是一个可变的借位:

if v[i].a == v[j].a {
v[i].a = 5;
}
非常清楚这是正在发生的事情(但反之则更好):
let a = &v[i];
let b = &v[j];
if a.a == b.a {
let mut_a = &mut v[i];
mut_a.a = 5;
}
借阅检查器的规则之一是,同一事物不能同时存在两个可变的借阅。

关于rust - Double for循环可变引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66360306/

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