rust的引用规则小例1

rust的借用有个规则,1个对象如果要被借用:

  1. 要么被多次不可变借用
  2. 要么被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.
    }
}

先把要删的东西收集起来,这里需要增加一次拷贝,然后再统一删除.