Ошибка компиляции "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,
}