在使用相同变量时借用可变两次

Blu*_*ber 2 ownership rust borrow-checker

假设我正在浏览一个向量(不一定是线性的,所以我不能只使用map)而且我需要在满足某些条件时更改一个元素.我会想用一些变量来跟踪我的位置,例如current变量之类的东西

let mut v = vec![1, 2, 3, 4];

let mut current = &mut v[0];
Run Code Online (Sandbox Code Playgroud)

然后检查current某些条件,看是否需要更改.但是,当我这样做的时候

current = &mut v[1];
Run Code Online (Sandbox Code Playgroud)

它给了我cannot borrow v as mutable more than once at a time.

我觉得这应该被允许,因为我只使用了一个变量,而且我再也无法访问旧的借用了.

有什么方法可以让我知道我正在给第一次借回来,所以我不是要借两次?或者我一直在考虑这个错误,我应该使用不同的生锈习惯用法?我通过使用向量的indeces而不是可变引用来解决这个问题,但我认为"遍历使用a current然后更改它"的问题不仅仅是向量.如果我的数据结构没有多余的怎么办?

sta*_*lue 5

可变引用存在,直到变量超出范围,因此您可以通过在每个变量周围放置块来顺序地进行多次可变借用:

fn do_stuff(n: &mut usize) {
    *n += 1;
}

fn main() {
    let mut v = vec![1, 2, 3, 4];
    {
        let current = &mut v[1];
        do_stuff(current);
    }
    {
        let current = &mut v[0];
        do_stuff(current);
    }
    println!("{:?}", v);
}
Run Code Online (Sandbox Code Playgroud)

对于非词汇生命周期,这是不必要的,目前只有夜间版本可用:

#![feature(nll)]

fn do_stuff(n: &mut usize) {
    *n += 1;
}

fn main() {
    let mut v = vec![1, 2, 3, 4];

    let mut current = &mut v[1];
    do_stuff(current);

    current = &mut v[0];
    do_stuff(current);

    println!("{:?}", v);
}
Run Code Online (Sandbox Code Playgroud)