Rust - “while let”语句中的双重可变借用

Ske*_*ric 4 avl-tree mutability rust borrow-checker

抱歉,如果这是一个愚蠢的问题,我对 Rust 还比较陌生,只是无法破解这个双重可变借用错误。我正在尝试创建一个 AVL 树方法,该方法可以找到可以插入新节点的适当位置。我不明白我需要做什么才能放弃第一笔借款。

我试图在没有 RC、RefCell 或 Unsafe 的情况下做到这一点 - 尽管我越来越不清楚我的方法是否可行。

Rust 游乐场链接

    pub fn find_pos(&mut self, key: &K) -> &mut Link<K, V>{
        let mut current = &mut self.root;
        while let Some(node) = current.as_mut() {  // <- first mutable borrow
            match node.key.cmp(&key) {
                Ordering::Equal => break,
                Ordering::Greater => {
                    current = &mut node.right;
                },
                Ordering::Less => {
                    current = &mut node.left;
                },
            }
        };
        current  // <- second mutable borrow
    }
Run Code Online (Sandbox Code Playgroud)

我也尝试过与此处描述的解决方案类似的方法,但没有成功。

    pub fn find_pos(&mut self, key: &K) -> &mut Link<K, V> {
        let mut current = &mut self.root;
        loop {
            let tmp = current;
            if let Some(ref mut node) = *tmp {
               match node.key.cmp(&key) {
                   Ordering::Equal => {
                       current = tmp;
                       break
                   },
                   Ordering::Greater => {current = &mut node.right},
                   Ordering::Less => {current = &mut node.left},
               }
            } else {
                current = tmp;
                break
            }
        }
        current
    }
Run Code Online (Sandbox Code Playgroud)

Cha*_*man 7

这是借用检查器的一个已知限制。下一代Polonius将解决这个问题。

同时,解决方案(没有unsafe)是重复计算。在你的情况下,这意味着一些unwrap()

pub fn find_pos(&mut self, key: &K) -> &mut Link<K, V> {
    let mut current = &mut self.root;
    while current.as_mut().is_some() {
        match current.as_mut().unwrap().key.cmp(&key) {
            Ordering::Equal => break,
            Ordering::Greater => {
                current = &mut current.as_mut().unwrap().right;
            }
            Ordering::Less => {
                current = &mut current.as_mut().unwrap().left;
            }
        }
    }
    current
}
Run Code Online (Sandbox Code Playgroud)

也可以看看:


归档时间:

查看次数:

514 次

最近记录:

2 年,12 月 前