У меня есть постоянная ошибка компиляции, когда Rust жалуется, что у меня есть неизменный заем, пока я пытаюсь получить изменчивый заем, но неизменный заем принадлежит другой области, и я ничего не переношу.
У меня есть некоторый код, который проверяет значение на карте, и, если оно присутствует, возвращает его, в противном случае необходимо изменить карту различными способами. Проблема в том, что я не могу найти способ получить Rust, позволяющий мне делать оба, хотя эти две операции полностью разделены.
Вот некоторый бессмысленный код, который следует той же структуре, что и мой код, и демонстрирует проблему:
use std::collections::BTreeMap;
fn do_stuff(map: &mut BTreeMap<i32, i32>, key: i32) -> Option<&i32> {
// extra scope in vain attempt to contain the borrow
{
// borrow immutably
if let Some(key) = map.get(&key) {
return Some(key);
}
}
// now I'm DONE with the immutable borrow, but rustc still thinks it borrowed
map.insert(0, 0); // borrow mutably, which errors
None
}
Это ошибки с:
error[E0502]: cannot borrow '*map' as mutable because it is also borrowed as immutable
--> src/lib.rs:14:5
|
3 | fn do_stuff(map: &mut BTreeMap<i32, i32>, key: i32) -> Option<&i32> {
| - let call the lifetime of this reference ''1'
...
7 | if let Some(key) = map.get(&key) {
| --- immutable borrow occurs here
8 | return Some(key);
| --------- returning this value requires that '*map' is borrowed for ''1'
...
14 | map.insert(0, 0); // borrow mutably, which errors
| ^^^^^^^^^^^^^^^^ mutable borrow occurs here
Это не имеет никакого смысла для меня. Как неизменный заем переживает этот масштаб?! Одна ветвь этого match
выходит из функции через return
, а другая ничего не делает и покидает область действия.
Я видел это раньше, когда я ошибочно занимался контрабандой заимствований за пределы какой-либо другой переменной, но здесь это не так!
Правда, заимствование выходит за пределы области действия с помощью оператора return
, но смешно, что это блокирует заимствование еще дальше вниз в функции - программа не может вернуться и продолжить работу! Если я верну что-то еще там, ошибка исчезнет, поэтому я думаю, что это то, что зацикливается на контроле заимствований. Это похоже на ошибку для меня.
К сожалению, я не смог найти способ переписать это, не нажимая на ту же ошибку, так что это особенно неприятная ошибка, если это так.