rust - Why do I get expected type `()` when trying to obtain a reference to a boxed value? -
i have struct:
pub struct node<t> { value: t, left: option<box<node<t>>>, right: option<box<node<t>>>, } impl<t> node<t> { pub fn getleft(&self) -> option<&self> { if self.left.is_some() { some(&(*(self.left.unwrap()))) // some(self.left.unwrap()) <= same result } none } } fn main() {}
there seems type mismatch error:
error[e0308]: mismatched types --> src/main.rs:10:13 | 10 | some(&(*(self.left.unwrap()))) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected (), found enum `std::option::option` | = note: expected type `()` found type `std::option::option<&node<t>>`
i'm new rust , don't understand why expected type ()
while should option<&self>
, how can return reference node inside box (how can move out of borrowed self)?
the problem here isn't borrow-checker. if have if
without else
, must return unit (i.e. ()
). you're trying return value function, means need either have else
branch, or use return
. wit:
impl<t> node<t> { pub fn getleft(&self) -> option<&self> { if self.left.is_some() { some(&(*(self.left.unwrap()))) } else { none } } }
ok, now borrow-checker problem. because you're taking reference temporary (the result of self.left.unwrap()
). need access contents of option
without moving it. let's that:
impl<t> node<t> { pub fn getleft(&self) -> option<&self> { if self.left.is_some() { some(&(*(self.left.as_ref().unwrap()))) } else { none } } }
that's better, it's ugly. there's unwrap
, plus redundant parentheses, name non-idiomatic, , whole branch unnecessary. let's fix of those:
impl<t> node<t> { pub fn get_left(&self) -> option<&self> { self.left.as_ref().map(|l| &**l) } }
or, if want clearer:
impl<t> node<t> { pub fn get_left(&self) -> option<&self> { if let some(left) = self.left.as_ref() { some(&**left) } else { none } } }
Comments
Post a Comment