for-loop - 如何在 vector 的元素上运行 for 循环并更改 for 循环内部和 for 循环外部的向量?

标签 for-loop rust move borrow-checker ownership

我是 Rust 的新手。我需要在 for 循环之前创建一个向量。在其上运行 for 循环。更改 for 循环内的向量。然后在 for 循环之后更改向量。

我尝试了以下代码并尝试使用不可变借用,但都没有用。

fn main() {
    let mut vec1 = vec![4, 5];
    vec1.push(6);
    for i in vec1 {
        if i % 2 == 0 {
            vec1.push(7);
        }
    }
    vec1.push(8);
    println!("vec1={:?}", vec1);
}

我希望在 for 循环内部和之后编译和更改向量。但它显示此错误消息:

error[E0382]: borrow of moved value: `vec1`
 --> src/main.rs:6:13
  |
2 |     let mut vec1 = vec![4, 5];
  |         -------- move occurs because `vec1` has type `std::vec::Vec<i32>`, which does not implement the `Copy` trait
3 |     vec1.push(6);
4 |     for i in vec1 {
  |              ----
  |              |
  |              value moved here
  |              help: consider borrowing to avoid moving into the for loop: `&vec1`
5 |         if i % 2 == 0 {
6 |             vec1.push(7);
  |             ^^^^ value borrowed here after move

你能解释一下为什么会发生 move 吗?你能让它编译吗?

最佳答案

您的代码有两个问题。幸运的是,这两个问题都可以通过改变一件事来解决。问题是:

  • 编写 for _ in vec1 将值 vec1 move 到循环中。这是一个与其他所有 Action 一样的 Action ,这意味着在循环后无法访问该值!如果您需要复习所有权和搬家,请阅读 the related chapter in the Rust book .您可以通过 for _ in &vec1 迭代对向量元素的引用。
  • 你正试图改变你正在迭代的向量。无论您是按值(正如您所做的那样)还是按引用迭代向量,都不能在迭代向量时更改向量。这有很多充分的理由!在您的情况下,如果您在迭代时添加元素,很容易导致无限循环。

要同时解决这两个问题,您可以迭代向量的索引而不是向量元素 ( Playground):

let mut vec1 = vec![4, 5];
vec1.push(6);
for i in 0..vec1.len() {
    if vec1[i] % 2 == 0 {
        vec1.push(7);
    }
}
vec1.push(8);
println!("vec1={:?}", vec1);

这样,向量不会被 for 循环 move 或借用,我们可以在循环期间和之后自由地改变它。这个特定的解决方案迭代原始向量的索引,这意味着循环中添加的元素不会被循环迭代。这是避免意外无限循环的良好保护。但是请注意,您仍然可以搬起石头砸自己的脚,例如,在迭代期间从向量中删除元素。一般来说,独立于编程语言,在迭代集合时改变集合是危险的,应该小心谨慎地完成。

关于for-loop - 如何在 vector 的元素上运行 for 循环并更改 for 循环内部和 for 循环外部的向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57637354/

相关文章:

shell - 如何在同时传送stdio的同时模拟TTY?

rust - 理解 &type + 'a 语法

php - 将数据从一个表 move 到另一个表时出错

c++ - 我该如何进一步优化这个循环?

c# - 将 C# 实例方法作为回调传递给 Rust?

java - 循环停止执行时迭代器的值

css - 将鼠标移到社交图标上时如何更改它们的颜色?

java - Java 中的 move/复制文件操作

ios - 我不能在 Swift 中调用多个应用程序消息

并行运行 if 循环