Rust借用检查器在范围结束后阻止重用

时间:2017-04-29 09:04:25

标签: rust borrow-checker

这里有一些我无法编​​译的代码:

struct HasVec {
    vec: Vec<u8>,
}

fn get_or_make<'a>(container: &'a mut HasVec) -> &'a mut u8 {
    let ref mut vec = container.vec;
    {
        for element in vec.iter_mut() {
            if *element > 9 {
                return element;
            }
        }
    }
    vec.push(10);
    vec.last_mut().unwrap()
}

编译器的输出是:

error[E0499]: cannot borrow `*vec` as mutable more than once at a time
   |
8  |             for element in vec.iter_mut() {
   |                            --- first mutable borrow occurs here
...
14 |         vec.push(10);
   |         ^^^ second mutable borrow occurs here
15 |         vec.last_mut().unwrap()
16 |     }
   |     - first borrow ends here


error[E0499]: cannot borrow `*vec` as mutable more than once at a time
   |
8  |             for element in vec.iter_mut() {
   |                            --- first mutable borrow occurs here
...
15 |         vec.last_mut().unwrap()
   |         ^^^ second mutable borrow occurs here
16 |     }
   |     - first borrow ends here

error[E0499]: cannot borrow `*vec` as mutable more than once at a time
   |
8  |             for element in vec.iter_mut() {
   |                            --- first mutable borrow occurs here
...
15 |         vec.last_mut().unwrap()
   |         ^^^ second mutable borrow occurs here
16 |     }
   |     - first borrow ends here

借款是否应该在第13行的范围结束时结束?我还没有找到任何方法来重构那些能满足借用检查器的代码。将let ref mut vec = container.vec;放在带有for循环的代码块内,而将另一个置于该块之后则不起作用,如果没有ref变量,也不会直接访问container.vec

我正在使用Rust 1.16.0。

0 个答案:

没有答案