我有以下代码:
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 语句来解构由 left
变量表示的 Option
,如下所示:
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
的正确方法是什么?有吗?
最佳答案
编译器会提示,因为在匹配中,arm 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,
}
}
您可以看到它的实际效果 on the Playground .
与 Non Lexical Lifetimes启用后,您的代码可以正常编译:Playground .
关于rust - 匹配时如何不借用期权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50752778/