不重新借用可变切片时,for 循环中发生移动错误

K.C*_*Cho 5 vector rust

我试图将可变切片传递给函数并在其中的多个循环中使用它。

function1产生错误。更改为function2orfunction3会使错误消失,但我不明白function1和之间的区别function2。v和&mut *v我看起来很相似。

function1为什么其他人都可以工作却不起作用?

fn main() {
    let mut v = Vec::new();

    function1(&mut v);
    function2(&mut v);
    function3(&mut v);
}

// Move Error 
fn function1(v: &mut [i32]) {
    for l in v {}
    for l in v {} // <-- Error Here !!!
}

// Works Fine
fn function2(v: &mut [i32]) {
    for l in &mut *v {}
    for l in &mut *v {}
}

// Works Fine
fn function3(v: &mut [i32]) {
    for l in v.iter_mut() {}
    for l in v.iter_mut() {}
}
Run Code Online (Sandbox Code Playgroud)

错误:

fn main() {
    let mut v = Vec::new();

    function1(&mut v);
    function2(&mut v);
    function3(&mut v);
}

// Move Error 
fn function1(v: &mut [i32]) {
    for l in v {}
    for l in v {} // <-- Error Here !!!
}

// Works Fine
fn function2(v: &mut [i32]) {
    for l in &mut *v {}
    for l in &mut *v {}
}

// Works Fine
fn function3(v: &mut [i32]) {
    for l in v.iter_mut() {}
    for l in v.iter_mut() {}
}
Run Code Online (Sandbox Code Playgroud)

oli*_*obk 4

&mut *v正在做一个所谓的“重借”。

这意味着您不是迭代原始引用,而是迭代新引用。

这样想:


如果您有一个拥有的向量,并且您对其进行迭代,那么如果您尝试再次迭代它,您会得到相同的错误,因为它已被移动到 for 循环中。

相反,如果您借用向量并迭代借用的向量,那么您可以根据需要多次执行此操作。


如果您有一个可变借用,并且您对其进行迭代,那么您正在将可变借用移动到 for 循环中。所以现在已经消失了。

相反,如果您创建一个指向可变借用的新引用,那么您只是移出了新引用。一旦迭代完成,新的可变借用就消失了,这意味着可以再次访问原始的可变借用。