我试图将一个可变切片传递给一个函数并在其中的几个循环中使用它。
function1
会产生错误。更改为function2
或function3
会使错误消失,但我不理解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() {}
}
错误:
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
答案 0 :(得分:3)
&mut *v
正在做一个所谓的“再借”。
这意味着您不是迭代原始引用,而是迭代新引用。
以这种方式思考:
如果你有一个拥有的向量,并且你迭代它,那么如果你再次尝试迭代它就会得到同样的错误,因为它已被移动到for循环中。
如果您借用向量并迭代借用,那么您可以根据需要多次执行此操作。
如果你有一个可变的借位,并且你迭代它,那么你将可变借位移动到for循环中。所以它现在已经消失了。
如果您创建一个指向可变借位的新引用,那么您只是移出新引用。一旦迭代结束,新的可变借用就会消失,这意味着可以再次访问原始的可变借用。