Ske*_*ric 4 avl-tree mutability rust borrow-checker
抱歉,如果这是一个愚蠢的问题,我对 Rust 还比较陌生,只是无法破解这个双重可变借用错误。我正在尝试创建一个 AVL 树方法,该方法可以找到可以插入新节点的适当位置。我不明白我需要做什么才能放弃第一笔借款。
我试图在没有 RC、RefCell 或 Unsafe 的情况下做到这一点 - 尽管我越来越不清楚我的方法是否可行。
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)
这是借用检查器的一个已知限制。下一代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 次 |
最近记录: |