首页 > 解决方案 > 匹配时如何不借用期权?

问题描述

我有以下代码:

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 语句来解构Optionleft变量表示的,如下所示:

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

我想我知道我不能一成不变地借用一个结构成员然后可变地借用这个结构。但如果是这样的话,模式匹配 my 的正确方法是什么Option?有吗?

标签: rust

解决方案


编译器抱怨,因为在匹配臂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,
    }
}

您可以在 Playground 上看到这一点。

启用Non Lexical Lifetimes后,您的代码编译得很好:Playground


推荐阅读