Чтобы узнать Rust, я реализую дерево/словарь AVL. Чтобы вставить новый элемент, я спускаюсь в дерево, пока не найду узел, в который он может быть вставлен. К сожалению, он жалуется на несколько проблем с указателями заимствований, и у меня возникают проблемы с их расшифровкой.Захват указателя ошибок рекурсивного перемещения дерева
Я подсчитал, где и какие ошибки происходят.
enum AVLTree<T, U> {
Tree(T, U, Box<AVLTree<T, U>>, Box<AVLTree<T, U>>),
Empty,
}
impl<T, U> AVLTree<T, U>
where T: PartialOrd + PartialEq + Copy,
U: Copy
{
fn insert_element(&mut self, key: T, val: U) {
let new_node = AVLTree::Tree(key, val, Box::new(AVLTree::Empty), Box::new(AVLTree::Empty));
if let AVLTree::Empty = *self {
*self = new_node;
return;
}
let mut at = self;
loop {
match at {
&mut AVLTree::Tree(key2, _, ref mut left, ref mut right) => {
// ^~~~~~~~~~~~
// error: cannot borrow `at.2` as mutable more than once at a time
// ^~~~~~~~~~~~~
// error: cannot borrow `at.3` as mutable more than once at a time
if key < key2 {
if let AVLTree::Empty = **left {
*left = Box::new(new_node);
break;
}
at = &mut **left;
// error: cannot assign to `at` because it is borrowed
} else {
if let AVLTree::Empty = **right {
*right = Box::new(new_node);
break;
}
at = &mut **right;
// error: cannot assign to `at` because it is borrowed
}
}
&mut AVLTree::Empty => unreachable!(),
}
}
// Do something
}
}
Почему деконструкции at
заимствует его? Почему компилятор жалуется на несколько изменчивых заимствований, когда этого никогда не должно произойти? Как этот код может быть написан вместо этого, чтобы избежать таких ошибок?
Пожалуйста, рассмотреть вопрос о создании [MCVE] (http://stackoverflow.com/help/mcve), когда задавать вопросы. Это помогает понять специфические проблемы, а также помогает ответчикам понять это быстрее. Вот пример этого примера (http://is.gd/CbhAHY). – Shepmaster
Спасибо за намек, я буду иметь это в виду в будущем. (Я не часто задаю вопросы, поэтому я немного неудобен) – azgult
Не беспокойтесь! Мы все должны что-то начать.^_^ – Shepmaster