gpt4 book ai didi

vector - 不重新借用可变切片时在 for 循环中移动错误

转载 作者:行者123 更新时间:2023-11-29 07:54:51 25 4
gpt4 key购买 nike

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

function1 产生错误。更改为 function2function3 会使错误消失,但我不明白 function1function2 之间的区别. 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

最佳答案

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

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

这样想:


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

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


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

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

关于vector - 不重新借用可变切片时在 for 循环中移动错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46597528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com