rust - 重构匹配语句以满足借用检查器
问题描述
我正在尝试编写一个 trie 结构,它接收一个字符流,如果它还不存在,则将它们添加到 trie 中。当它添加一个字符时,它会返回顶部重新开始。
#[derive(Debug)]
pub struct Trie {
char: u8,
children: [Option<Box<Self>>; 2],
}
impl Trie {
pub fn new(char: u8) -> Trie {
return Trie {
char,
children: [None, None],
};
}
pub fn push(&mut self, lz_pair: Trie) {
let idx = lz_pair.char as usize;
self.children[idx] = Some(Box::new(lz_pair));
}
pub fn get_child(&mut self, char: u8) -> Option<&mut Trie> {
let child = self.children[char as usize].as_mut();
if let Some(c) = child {
Some(c.as_mut())
} else {
None
}
}
}
fn main() {
let data = b"abbabababbbbbabaaaabababaa";
let mut root = Trie::new(0);
let mut cur = &mut root;
for c in data {
cur = match cur.get_child(*c) {
Some(child) => child,
None => {
cur.push(Trie::new(*c - 97));
&mut root
}
};
}
}
实际的代码要复杂一些,但我将它提炼出来只是为了显示这个错误。
借阅检查员抱怨:
error[E0499]: cannot borrow `*cur` as mutable more than once at a time
--> src/main.rs:40:17
|
37 | cur = match cur.get_child(*c) {
| --- first mutable borrow occurs here
...
40 | cur.push(Trie::new(*c - 97));
| ^^^
| |
| second mutable borrow occurs here
| first borrow used here, in later iteration of loop
展开 s 时,我已经阅读了关于借用检查器错误的所有问题Option
(即This question and all the duplicates),所以我有点理解它为什么会发生,但是我不知道如何重组这段代码来解决这个问题特殊案例。
当我使用 2018 版 Rust 进行编译时,非词法生命周期似乎无法解决这个问题。
解决方案
推荐阅读
- android - Admob show 测试广告,但不是真实广告
- java - 在 Multi-Sim 设备中检测来电的目标 SimCard
- java - Spring @KafkaListener 和并发
- android - Android Studio 和 Phone 有不同的签名
- node.js - MongoDB 以本地时间存储日期对象,而不是 UTC
- r - “使用数据包 1 时出错” - 未找到对象。仅当在服务器/HPC 上使用 mclapply 时格子绘图中的错误
- javascript - 更新反应钩子中的嵌套对象
- video - 混合具有不同运行时间的文件
- javascript - 如何将谷歌自动填充位置限制在 N 个国家/地区?
- react-native - React Native Elements:如何在导航栏中显示标题组件?