如何在rust中更改内部for循环中的数据,解决方法是什么?

uinbv5nw  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(164)

刚开始生 rust 。我被卡住了。
我有一个Vec of Vec of &str(基本上是CSV行的集合,每行都是Vec of &str)。
我想循环访问整个集合,并有条件地更改一些单元格的值。
我已经尝试了一些方法,用迭代器和枚举()来操作索引。
但最后,我总是遇到这个错误-〉错误[E0499]:不能一次多次借用*row作为可变变量。
我真的不知道该怎么做。有什么解决办法吗?

//iterate over the collection of rows
    for row in &mut raw_data_rows[0..] {
        //iterate over row cells
        for item in &mut row[0..] {
            //if cell == "n/a"
            if item.to_string() == "n/a" {
                //change it to something else
                todo!(); //change the value of the item
            }
        }
    }

先谢谢你了。

t3psigkw

t3psigkw1#

我看不出有什么问题,我只是用.iter_mut()显式地进行了迭代。
请注意,我不确定&str是否是您想要的,使用String将允许修改它们的内容,而不仅仅是替换它们。
正如在评论中所要求的,下面是为什么我发现这些迭代是明确的:

  • v.iter_mut()意味着在每次迭代中,我想获得对下一个元素的互斥(可变)引用。
  • v.iter()意味着在每次迭代时,我想获得对下一个元素的共享(不可变)引用。
  • v.into_iter()意味着在每次迭代时我想要消费/提取下一个元素(v在那之后应该不可用)。
  • 直接在v上迭代会隐式调用v.into_iter(),它应该 * 消费 * 元素,但如果v不是一个值,而是一个容器的引用,它的行为就像v.iter()一样,这在我看来是相当令人困惑的。这就是为什么我在迭代序列时总是试图明确我的意图。
fn main() {
    let mut raw_data_rows = vec![
        vec!["aa", "bb", "cc"],
        vec!["dd", "n/a", "ee"],
        vec!["ff", "gg", "hh"],
    ];
    for row in raw_data_rows.iter_mut() {
        for item in row.iter_mut() {
            if *item == "n/a" {
                *item = "NEW_ITEM"
            }
        }
    }
    println!("{:?}", raw_data_rows);
}
/*
[["aa", "bb", "cc"], ["dd", "NEW_ITEM", "ee"], ["ff", "gg", "hh"]]

* /

相关问题