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
}
这对我来说感觉很恶心。而不是检查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
我想我知道我不能一成不变地借用一个结构成员然后可变地借用这个结构。但如果是这样的话,模式匹配 my 的正确方法是什么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,
}
}
您可以在 Playground 上看到这一点。
启用Non Lexical Lifetimes后,您的代码编译得很好:Playground。
推荐阅读
- python - Python数据框:添加当另一列更改时递增的列
- php - How to solve the problem of dynamic rowspan problem in table in laravel
- inno-setup - Using scripting constant in DirExistsWarning and other directives
- php - 在centos7中使用nginx + php-fpm安装nextcloud中所有这些semanage规则的目的是什么?
- shell - awk 通过 awk 命令传递 shell 变量
- angular - 在 Angular 6 组件错误中声明模型
- oracle - ORA-01036: Oracle 18 和 Oracle 19 Windows 客户端的非法变量名称/编号
- ios - Custom UITableViewCell with xib hiding after click on tableView
- mocking - 如何开玩笑模拟 aws-sdk 函数 SharedIniFileCredentials
- c - Bullseye matrix draw