我试图将可变切片传递给函数并在其中的多个循环中使用它。
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)
&mut *v正在做一个所谓的“重借”。
这意味着您不是迭代原始引用,而是迭代新引用。
这样想:
如果您有一个拥有的向量,并且您对其进行迭代,那么如果您尝试再次迭代它,您会得到相同的错误,因为它已被移动到 for 循环中。
相反,如果您借用向量并迭代借用的向量,那么您可以根据需要多次执行此操作。
如果您有一个可变借用,并且您对其进行迭代,那么您正在将可变借用移动到 for 循环中。所以现在已经消失了。
相反,如果您创建一个指向可变借用的新引用,那么您只是移出了新引用。一旦迭代完成,新的可变借用就消失了,这意味着可以再次访问原始的可变借用。