Rust 使用同一变量时借用可变项两次

Rust 使用同一变量时借用可变项两次,rust,borrow-checker,ownership,Rust,Borrow Checker,Ownership,假设我通过一个向量(不一定是线性的,所以我不能只使用map),当元素满足某些条件时,我需要改变它。我会考虑使用一些变量来跟踪我的位置,例如,像current变量之类的东西 let mut v = vec![1, 2, 3, 4]; let mut current = &mut v[0]; 然后检查currentto以查看是否需要更改某些条件。然而,当我 current = &mut v[1]; 它给了我一个一次不能借用v作为可变变量的问题 我觉得这应该是允许的,因为我只使用

假设我通过一个向量(不一定是线性的,所以我不能只使用map),当元素满足某些条件时,我需要改变它。我会考虑使用一些变量来跟踪我的位置,例如,像
current
变量之类的东西

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

let mut current = &mut v[0];
然后检查
current
to以查看是否需要更改某些条件。然而,当我

current = &mut v[1];
它给了我一个
一次不能借用v作为可变变量的问题

我觉得这应该是允许的,因为我只使用了一个变量,并且我不能再访问旧的借来


有没有办法让rust知道我会把第一次借来的钱还给他,这样我就不会借两次了?还是我一直在想这个错误,有一个不同的生锈习语我应该使用?我已经通过使用向量的索引而不是可变引用解决了这个问题,但是我认为“使用
当前
遍历然后更改它”的问题不仅仅是向量。如果我使用的数据结构没有索引怎么办?

如果要访问多个索引,必须创建一个作用域

fn main() {
    let mut vec = vec![2, 3, 5];
    {
        let mut current1 = vec.get_mut(1);
        println!("{:?}", current1);
    }
    {
        let mut current2 = vec.get_mut(2);
        println!("{:?}", current2);
    }

    for i in 0..3 {
        let mut current = vec.get_mut(i);
        println!("{:?}", current);
    }
}

可变引用一直存在,直到变量超出范围,因此您可以通过在每个可变引用周围放置块,按顺序创建多个可变引用:

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);
}
对于非词汇生存期,这是不必要的,目前仅在夜间版本上可用:

#![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);
}

对于我正在做的问题,我没有线性地通过向量。制作自定义迭代器是最好的方法吗?如果下面的答案之一解决了您的问题,您应该接受它(单击相应答案旁边的复选标记)。这有两件事。它让每个人都知道你的问题已经解决到令你满意的程度,并让帮助你的人相信你的帮助。如果我尝试在
之后使用
current=vec.get_mut(2)
let mut current=vec.get_mut(1)它仍然给了我“不能像易变的一样借两次”的区别。get_mut(n)
&mut vec[n]
之间的唯一区别是前者返回一个
选项,而后者在
n
超出范围时会惊慌失措。删除第一段。