我有以下代码:
fn remove_descendent(&mut self, key: &K) -> Option<V> {
if self.left.is_some() && self.left.as_ref().unwrap().key == *key {
return self.remove_left();
}
// more of the function
}
这对我来说感觉很恶心。而不是检查is_some
然后打开包装。我认为我真正应该做的是使用 match 语句来解构Option
代表为left
像这样的变量:
fn remove_descendent(&mut self, key: &K) -> Option<V> {
match self.left {
Some(ref left) if left.key == *key => self.remove_left(),
_ => None
}
但是,当我这样做时,我收到以下错误:
error[E0502]: cannot borrow `*self` as mutable because `self.left.0` is also borrowed as immutable
--> src/lib.rs:29:51
|
29 | Some(ref left) if left.key == *key => self.remove_left(),
| -------- ^^^^ mutable borrow occurs here
| |
| immutable borrow occurs here
30 | _ => None
31 | }
| - immutable borrow ends here
我想我知道我不能一成不变地借用结构成员,然后可变地借用该结构。但如果是这样的话,模式匹配我的正确方法是什么Option
?有吗?
编译器会抱怨,因为在匹配臂中self
还是借的。您可以通过克隆来解决这个问题key
预先:
fn remove_descendent(&mut self, key: &K) -> Option<V> {
match self.left.clone() {
Some(ref left) if left.key == *key => self.remove_left(),
_ => None,
}
}
你可以看到它的实际效果.
With 非词汇生命周期 https://github.com/rust-lang/rust-roadmap/issues/16启用后,您的代码可以正常编译:.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)