本文介绍了如何在向量的元素上运行for循环,并在Ruust中更改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

你能解释一下为什么会发生移动吗?您能编译它吗?

推荐答案

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

  • 写入for _ in vec1会将值vec1移入循环。这是一个像其他所有移动一样的移动,这意味着在循环之后该值是不可访问的!如果您需要关于所有权和搬家的复习,请阅读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循环移动或借用,我们可以在循环期间和之后自由地改变它。这个特定的解决方案迭代原始向量的索引,这意味着循环不会迭代添加到循环中的元素。这是一种很好的保护,可以避免意外的无限循环。但是,请注意,您仍然可以通过在迭代期间删除向量中的元素来攻击自己的脚。一般来说,与编程语言无关,在迭代集合的同时对集合进行变异是危险的,应该谨慎行事。

这篇关于如何在向量的元素上运行for循环,并在Ruust中更改for循环内部和外部的向量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-30 04:29