У меня следующая древовидная структура:
use std::cell::RefCell;
use std::rc::Rc;
use std::cmp;
use std::cmp::Ordering;
type AVLTree<T> = Option<Rc<RefCell<TreeNode<T>>>>;
#[derive(Debug, PartialEq, Clone)]
struct TreeSet<T: Ord> {
root: AVLTree<T>,
}
impl<T: Ord> TreeSet<T> {
fn new() -> Self {
Self {
root: None
}
}
fn insert(&mut self, value: T) -> bool {
let current_tree = &mut self.root;
while let Some(current_node) = current_tree {
let node_key = ¤t_node.borrow().key;
match node_key.cmp(&value) {
Ordering::Less => { let current_tree = &mut current_node.borrow_mut().right; },
Ordering::Equal => {
return false;
}
Ordering::Greater => { let current_tree = &mut current_node.borrow_mut().left; },
}
}
*current_tree = Some(Rc::new(RefCell::new(TreeNode {
key: value,
left: None,
right: None,
parent: None
})));
true
}
}
#[derive(Clone, Debug, PartialEq)]
struct TreeNode<T: Ord> {
pub key: T,
pub parent: AVLTree<T>,
left: AVLTree<T>,
right: AVLTree<T>,
}
fn main() {
let mut new_avl_tree: TreeSet<u32> = TreeSet::new();
new_avl_tree.insert(3);
new_avl_tree.insert(5);
println!("Tree: {:#?}", &new_avl_tree);
}
Сборка с cargo build
- это нормально, но когда я запускаю cargo run
, я получаю следующую ошибку:
поток 'main' запаниковал на 'уже заимствованном: BorrowMutError', src \ libcore \ result.rs: 1165: 5
примечание: запустите с переменной среды
RUST_BACKTRACE=1
, чтобы отобразить трассировку. ошибка: процесс неуспешно выйти:
target\debug\avl-tree.exe
(код выхода: 101)
Если я просто позвоню insert(3)
, все будет хорошо, и мое дерево будет напечатано правильно. Однако, если я insert(5)
после insert(3)
, я получу эту ошибку.
Как мне это исправить?
let current_tree = ...
создает новую локальную переменную. Однако алгоритм мог работать только в том случае, еслиcurrent_tree
переназначен в цикле. Если вы инициализируетеcurrent_tree
какmut
и удалитеlet
при переназначении, то появятся ошибки компиляции. И все же это была легкая часть. - person CoronA   schedule 30.11.2019