Consider the following code for binary tree
#[derive(Debug)]
struct Binary_Tree_Node<T: PartialOrd + Clone> {
left: Binary_Tree<T>,
value: T,
right: Binary_Tree<T>
}
#[derive(Debug)]
struct Binary_Tree<T: PartialOrd + Clone> {
node: Option<Box<Binary_Tree_Node<T>>>
}
impl <T: PartialOrd + Clone>Binary_Tree<T> {
fn new(value_to_insert: T) -> Binary_Tree<T> {
Binary_Tree{node:
Some(
Box::new(
Binary_Tree_Node{
left: Binary_Tree{node: None},
value: value_to_insert,
right: Binary_Tree{node: None}
}
)
)
}
}
fn map<F, U>(&self, f: F) -> Option<U>
where F: FnOnce(&Binary_Tree_Node<T>) -> U {
self.node.as_ref().map(|node| f(&**node))
// equivalent
//self.node.as_ref().map(|node| f(node))
}
}
let mut test1 = Binary_Tree::new(10);
println!("{:#?}", test1.map(|node| node.value < 2));
This line confuses me
self.node.as_ref().map(|node| f(node))
as I expect rust to throw compiler error
self.node
is of type Option<Box<Binary_Tree_Node<T>>>
self.node.as_ref()
is of type Option<&Box<Binary_Tree_Node<T>>>
node
in self.node.as_ref().map(|node| f(node))
is of type &Box<Binary_Tree_Node<T>>
&Box<Binary_Tree_Node<T>>
is not equivalent to the generic constraint &Binary_Tree_Node<T>
The question is why both self.node.as_ref().map(|node| f(&**node))
and self.node.as_ref().map(|node| f(node))
work?