rust的引用规则小例1
rust的借用有个规则,1个对象如果要被借用:
- 要么被多次不可变借用
- 要么被1次可变借用
这个文章就举个例子来让人更加深入理解上述规则.
一个hashmap,希望删除其中的某些kv对,怎么做?
下面这个做法是错误示范,编译器报错:
fn delete_negative_keys(h: &mut HashMap<i32, i32>) {
// 错误写法:
// for k in h.keys() {
// if *k < 0 {
// h.remove(k);
// }
// }
}
原因是在for这个词法作用域内,h
被两次借用,第一次是h.keys()被不可变借用,第二次是h.remove()被可变借用。
正确做法(以及更rust的做法)如下:
fn delete_negative_keys(h: &mut HashMap<i32, i32>) {
let to_remove: Vec<i32> = h.keys().cloned().filter(|&t| t < 0).collect();
// ^ ^
// | |
// immutable borrow start. ------------------immutable borrow end.
for i in to_remove {
h.remove(&i); // so we can borrow mutably here.
}
}
先把要删的东西收集起来,这里需要增加一次拷贝,然后再统一删除.