Ошибка компиляции "cannot borrow `X` as mutable because it is also borrowed as immutable"

Не получается скомпилировать код и я не понимаю что не нравится компилятору, он выдаёт это:

error[E0502]: cannot borrow `counter` as mutable because it is also borrowed as immutable
  --> src/main.rs:38:17
   |
35 |         for (key, value) in &counter {
   |                             --------
   |                             |
   |                             immutable borrow occurs here
   |                             immutable borrow later used here
...
38 |                 counter.insert(*key, count);
   |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^ mutable borrow occurs here

For more information about this error, try `rustc --explain E0502`.
error: could not compile `variables` due to previous error

Вот сам код:

fn main() {
    let mut vect = vec![1,5,5,9,8,2,4,10];
    println!("{}", foo1(&vect));
    println!("{}", foo2(&mut vect));
    println!("{}", foo3(&vect));
}

fn foo3(keys: &Vec<i32>) -> i32 {
    let mut values = Vec::new();
    let mut i = 0;
    while i <= keys.len() {
        values.push(0);
        i += 1;
    }
    
    let mut counter: HashMap<_, _> = keys.into_iter().zip(values.into_iter()).collect();

    for i in keys {
        for (key, value) in &counter {
            if *i == **key {
                let count = *value+1;
                counter.insert(*key, count);
            };
        }
    }
    return 0;
}

Я пытался как то поменять код, но я просто не понимаю что делать, потому что меняющаяся скобка здесь:

38 |                 counter.insert(*key, count);
   |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^ mutable borrow occurs here

открывается в любом случае, но она либо как здесь, либо открывается вторая меняющаяся скобка, как тут:

  error[E0499]: cannot borrow `counter` as mutable more than once at a time
  --> src/main.rs:38:17
   |
35 |         for (key, value) in &mut counter {
   |                             ------------
   |                             |
   |                             first mutable borrow occurs here
   |                             first borrow later used here
...
38 |                 counter.insert(*key, count);
   |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^ second mutable borrow occurs here

Вторая и первая функции foo работают без ошибок. Помогите пожалуйста решить проблему.


Ответы (1 шт):

Автор решения: Swomp

Пришлось немного переделать и получился такой код:

fn foo3(keys: &Vec<i32>) -> HashMap<i32, i32> {
    let mut values = Vec::new();
    let mut i = 0;
    while i <= keys.len() {
        values.push(0);
        i += 1;
    }

    
    let counter: HashMap<_, _> = keys.into_iter().zip(values.into_iter()).collect();
    let mut counter2 = HashMap::new();

    for (key, value) in &counter {
        let mut count = 0;
        for i in keys {
            if *i == **key {
                count += 1;
                counter2.insert(**key, count);
            }
        }
    }

    return counter2;
}

вот функция main:

fn main() {
    let mut vect = vec![1,5,5,5,8,2,4,10];
    println!("{}", foo1(&vect));
    println!("{}", foo2(&mut vect));
    println!("{:#?}", foo3(&vect));
}

А вот вывод, который мне был нужен:

5
5
{
    4: 1,
    10: 1,
    5: 3,
    2: 1,
    8: 1,
    1: 1,
}
→ Ссылка