Vector 如何在没有错误的情况下增加向量中的每个数字;不能一次多次以可变方式借用";?

Vector 如何在没有错误的情况下增加向量中的每个数字;不能一次多次以可变方式借用";?,vector,rust,borrow-checker,Vector,Rust,Borrow Checker,此代码假定将向量中的每个值增加1: fn main() { let mut v = vec![2, 3, 1, 4, 2, 5]; let i = v.iter_mut(); for j in i { *j += 1; println!("{}", j); } println!("{:?}", &mut v); } 由于锈蚀的借用规则,它不起作用: error[E0499]:一次不能将'v'作为可变项借用多次 --

此代码假定将向量中的每个值增加1:

fn main() {
    let mut v = vec![2, 3, 1, 4, 2, 5];
    let i = v.iter_mut();
    for j in i {
        *j += 1;
        println!("{}", j);
    }
    println!("{:?}", &mut v);
}
由于锈蚀的借用规则,它不起作用:

error[E0499]:一次不能将'v'作为可变项借用多次
-->src/main.rs:8:27
|
3 |设i=v.iter_mut();
|-第一个可变借用发生在此处
...
8 | println!({:?},&mut v);
|^第二个可变借用发生在此处
9 | }
|-第一次借钱到此为止

如何完成此任务?

不要存储可变迭代器;在循环中直接使用它:

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

    for j in v.iter_mut() { // or for j in &mut v
        *j += 1;
        println!("{}", j);
    }

    println!("{:?}", &v); // note that I dropped mut here; it's not needed
}

由于非词法生命周期的存在,您的代码将像Rust的未来版本一样工作:


您也可以使用
map
collect
之类的

>> let mut v = vec![5,1,4,2,3];
>> v.iter_mut().map(|x| *x += 1).collect::<Vec<_>>();
>> v
[6, 2, 5, 3, 4]
>让mut v=vec![5,1,4,2,3];
>>v.iter_mut().map(|x |*x+=1).collect::();
>>五
[6, 2, 5, 3, 4]

第四行的
v.iter_mut()
的范围是什么?@saga是
for
循环的主体。所以我们必须使用嵌套范围来处理生锈的限制,对吗?@saga对于这样的循环,我会说这只是常规且简单的方法,但一般来说,是-嵌套作用域可以解决不同的借用检查器问题。@saga当然;例如,您可以在0..v.len()中为j编写
,然后参考
v[j]
,而不是
*j
>> let mut v = vec![5,1,4,2,3];
>> v.iter_mut().map(|x| *x += 1).collect::<Vec<_>>();
>> v
[6, 2, 5, 3, 4]