Не компилируется программа на Rust

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

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

`

> Помогите пожалуйста решить проблему.

`

В расте нельзя одновременно итерироваться по хэшмапе и менять её.
Чтобы сделать то, что вы хотите, вы можете итерироваться по &mut ссылкам.
Таким образом вы сможете изменять счётчик:

for i in keys {
     for (key, count) in &mut counter {
        if *i == **key {
            *count += 1;
        };
    }
}

Но на самом деле вам вообще не надо итерироваться по хэшмапе, вы её так по сути не используете.
В хэшмапе “соль” в том, что по ключу можно быстро получить значение, а вы этим пренебрегаете.

Мне кажется хорошим вариантом будет написать так:

fn foo3(keys: &Vec<i32>) -> i32 {
    let mut counter = HashMap::new();

    for key in keys {
        *counter.entry(key).or_insert(0) += 1;
    }

    return 0;
}

Ссылка на playground, где можно запустить код: (play)

1 лайк