Rust 匹配时如何不借用选项?
我有以下代码:Rust 匹配时如何不借用选项?,rust,Rust,我有以下代码: 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 } 但是,当我执行此操作时,会出现以
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
}
但是,当我执行此操作时,会出现以下错误:
error[E0502]:无法将“*self”作为可变项借用,因为“self.left.0”也作为不可变项借用
-->src/lib.rs:29:51
|
29 |如果left.key==*key=>self.remove_left(),则部分(ref left),
|----------^^^^^此处发生可变借用
| |
|不可变借用发生在这里
30 | |=>无
31 | }
|-不可变的借阅到此结束
我想我明白了,我不能一成不变地借用一个structs成员,然后可变地借用这个struct。但是如果是这样的话,什么是匹配我的
选项的正确方式呢?有吗?编译器抱怨,因为在匹配中,armself
仍然是借用的。您可以通过事先克隆键来解决此问题:
fn remove_descendent(&mut self, key: &K) -> Option<V> {
match self.left.clone() {
Some(ref left) if left.key == *key => self.remove_left(),
_ => None,
}
}
fn删除子代(&mut self,key:&K)->选项{
匹配self.left.clone(){
如果left.key==*key=>self.remove_left(),则为部分(ref left),
_=>没有,
}
}
你可以在行动中看到这一点
启用后,您的代码可以正常编译:。也许您想看看语法?@hellow如果let
不支持,那么克隆真的是我想要做的吗?看来我不该这么做。克隆难道不贵吗?
fn remove_descendent(&mut self, key: &K) -> Option<V> {
match self.left.clone() {
Some(ref left) if left.key == *key => self.remove_left(),
_ => None,
}
}