Почему следующий код не компилируется ( детская площадка ):
use std::collections::HashMap;
fn main() {
let mut h: HashMap<u32, u32> = HashMap::new();
h.insert(0, 0);
h.insert(1, h.remove(&0).unwrap());
}
Контролер заимствований жалуется, что:
error[E0499]: cannot borrow `h` as mutable more than once at a time
Код безопасен, однако, и почти механическое преобразование последней строки приводит к компиляции ( детская площадка ):
//h.insert(1, h.remove(&0).unwrap());
let x = h.remove(&0).unwrap();
h.insert(1, x);
Насколько я понимаю, этот вид проблемы был решен с нелексическими временами жизни. Этот вопрос является примером, и есть много других.
Есть ли какая-то хитрость, которая делает первый вариант неверным в конце концов, поэтому Руст прав, отказавшись от него? Или функция NLL все еще не завершена во всех случаях?