首页 > 解决方案 > 重构匹配语句以满足借用检查器

问题描述

我正在尝试编写一个 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 进行编译时,非词法生命周期似乎无法解决这个问题。

标签: rustlifetimeborrow-checker

解决方案


推荐阅读