Skillkiller
Skillkiller

Reputation: 27

Double for loop mutable references

I want to use a double For loop to compare each element with each and if these properties are the same, make a change to the objects. Below is a little demo code of what I want to do.

But the Rust compiler tells me here that I can't have 2 mutable references from the same object. How can I implement the whole thing differently?

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;
            }
        }
    }
}

Console:

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

Upvotes: 0

Views: 198

Answers (1)

Hadus
Hadus

Reputation: 1664

First thing to note is that you don't need two mutable references since you are only mutating v[i].

Writing it like this will create two immutable borrows and inside the if a mutable borrow:

if v[i].a == v[j].a {
   v[i].a = 5;
}

Being very explicit this is what is happening (but its nicer the other way):

let a = &v[i];
let b = &v[j];
if a.a == b.a {
    let mut_a = &mut v[i];
    mut_a.a = 5;
}

One of the rules of the borrow checker is that no two mutable borrows can exist to the same thing at the same time.

Upvotes: 2

Related Questions