Here is the example to show the compiling error.
The error result:
Compiling playground v0.0.1 (/playground)
error[E0499]: cannot borrow `*link` as mutable more than once at a time
--> src/main.rs:26:32
|
20 | fn search(&mut self, elem: &T) -> Result<&mut Link<T>, &mut Link<T>> {
| - let's call the lifetime of this reference `'1`
21 | let mut link = &mut self.root;
22 | while let Some(node) = link {
| ---- first mutable borrow occurs here
...
26 | _ => return Ok(link),
| ^^^^ second mutable borrow occurs here
...
30 | Err(link)
| --------- returning this value requires that `link.0` is borrowed for `'1`
Here is my example code:
#[derive(Debug)]
struct BinTreeNode<T> {
elem: T,
left: Option<Box<BinTreeNode<T>>>,
right: Option<Box<BinTreeNode<T>>>,
}
#[derive(Debug)]
struct BinTree<T> {
root: Option<Box<BinTreeNode<T>>>,
}
type Link<T> = Option<Box<BinTreeNode<T>>>;
impl<T: std::cmp::Ord> BinTree<T> {
fn new() -> Self {
Self { root: None }
}
fn search(&mut self, elem: &T) -> Result<&mut Link<T>, &mut Link<T>> {
let mut link = &mut self.root;
while let Some(node) = link {
match elem.cmp(&node.elem) {
std::cmp::Ordering::Less => link = &mut node.left,
std::cmp::Ordering::Greater => link = &mut node.right,
_ => return Ok(link),
}
}
Err(link)
}
fn insert(&mut self, elem: T) -> bool {
match self.search(&elem) {
Err(node) => {
node.replace(Box::new(BinTreeNode{
elem,
left:None,
right:None,
}));
true
}
_ => false,
}
}
}
pub fn main() {
let mut a = BinTree::new();
a.insert(5);
a.insert(3);
a.insert(4);
a.insert(6);
println!("{:?}", a);
}
Does anyone know how to solve this error?