[英]Rust - double mutable borrow in 'while let' statement
抱歉,如果这是一个愚蠢的问题,我对 Rust 比较陌生,只是无法破解这个双重可变借用错误。 我正在尝试创建一个 AVL 树方法,以找到可以插入新节点的适当 position 。 我不明白我需要做什么才能让第一次借款减少。
我试图在没有 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
}
我也尝试过类似于此处描述的解决方案,但没有运气。
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.