I am trying to learn Rust
and I feel like a dummy every step of the way.
I went through the tutorial on making lists in Rust. I am trying to apply the knowledge to implement a simple BST.
The code looks pretty horrible though. Any suggestions on how it can be improved?
pub struct Tree<T: Ord> {
root: Link<T>,
}
type Link<T> = Option<Box<Node<T>>>;
pub struct Node<T:Ord> {
elem: T,
left: Link<T>,
right: Link<T>
}
impl<T: Ord> Tree<T> {
pub fn new() -> Self {
Tree {root: None}
}
pub fn add(&mut self, elem: T) {
let mut current;
match self.root {
None => {
self.root = Some(Box::new(Node{elem: elem, left: None, right: None}));
return;
},
Some(_) => {
current = self.root.as_mut();
}
}
loop {
if elem < current.as_ref().unwrap().elem {
if current.as_ref().unwrap().left.is_none() {
current.unwrap().left = Some(Box::new(Node{elem: elem, left: None, right: None}));
break;
} else {
current = current.unwrap().left.as_mut();
}
} else {
if current.as_ref().unwrap().right.is_none() {
current.unwrap().right = Some(Box::new(Node{elem: elem, left: None, right: None}));
break;
} else {
current = current.unwrap().right.as_mut();
}
}
}
}
}
#[cfg(test)]
mod test {
use super:: Tree;
#[test]
fn basics() {
let mut tree = Tree::new();
tree.add(5);
tree.add(3);
tree.add(2);
tree.add(4);
assert_eq!(tree.root.as_ref().unwrap().elem, 5);
assert_eq!(tree.root.as_ref().unwrap().left.as_ref().unwrap().elem, 3);
assert_eq!(tree.root.as_ref().unwrap().left.as_ref().unwrap().left.as_ref().unwrap().elem, 2);
assert_eq!(tree.root.as_ref().unwrap().left.as_ref().unwrap().right.as_ref().unwrap().elem, 4);
}
}