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。但是如果是这样的话,什么是匹配我的
选项的正确方式呢?有吗?

编译器抱怨,因为在匹配中,arm
self
仍然是借用的。您可以通过事先克隆
键来解决此问题:

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,
    }
}