我试图将可变切片传递给函数并在其中的多个循环中使用它。
function1
产生错误。更改为function2
or function3
使错误消失,但我不明白之间的区别function1
and function2
. v
and &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() {}
}
错误:
error[E0382]: use of moved value: `v`
--> src/main.rs:12:14
|
11 | for l in v {}
| - value moved here
12 | for l in v {} // <-- Error Here !!!
| ^ value used here after move
|
= note: move occurs because `v` has type `&mut [i32]`, which does not implement the `Copy` trait
&mut *v
正在做一个所谓的“重借”。
这意味着您不是迭代原始引用,而是迭代新引用。
这样想:
如果你有一个owned向量,然后迭代它,然后如果您尝试再次迭代它,您会得到相同的错误,因为它已被移动到 for 循环中。
相反,如果您借用向量并迭代借用的向量,那么您可以根据需要多次执行此操作。
如果您有一个可变借用,并且您对其进行迭代,那么您正在将可变借用移动到 for 循环中。所以现在已经消失了。
相反,如果您创建一个指向可变借用的新引用,那么您只是移出了新引用。一旦迭代完成,新的可变借用就消失了,这意味着可以再次访问原始的可变借用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)