繁体   English   中英

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

[英]Rust - double mutable borrow in 'while let' statement

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

我试图在没有 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
    }

我也尝试过类似于此处描述的解决方案,但没有运气。

    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
    }

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

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

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
}

也可以看看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM