迭代迭代器并改变值会改变集合中的值吗?

时间:2017-08-05 19:13:32

标签: reference rust

我有一个HashMap<u32, u32>,我将它用作迭代器:

for (key, mut value) in map {
    if value == 0u32 {
        value = 1u32;
    }
    println!("{}", value);
} 

这会编译并打印出预期的值,但它实际上是在迭代它的时候改变了地图中的值,还是我只是遮住了实际值并且在迭代器完成后写出了值?

我是否正确地假设迭代中的变异通常适用于Rust迭代器?

1 个答案:

答案 0 :(得分:7)

  

它实际上是否会更改地图中的值

即可。事实上; 地图不再存在

for (key, mut value) in map { /* ... */ }    
println!("{:?}", map);
error[E0382]: use of moved value: `map`
  --> src/main.rs:14:22
   |
7  |     for (key, mut value) in map {
   |                             --- value moved here
...
14 |     println!("{:?}", map);
   |                      ^^^ value used here after move
   |
   = note: move occurs because `map` has type `std::collections::HashMap<u32, u32>`, which does not implement the `Copy` trait

已将地图的所有权以及所有键和值转移到迭代器。没了。请注意,地图甚至没有声明为可变,因此您无法对其进行更改。

如果想要修改所有值,您可以:

let mut map: HashMap<u32, u32> = HashMap::new();

for (_key, value) in &mut map {
    if *value == 0u32 {
        *value = 1u32;
    }
    println!("{}", value);
}

注意现在我们对键和值有一个引用,而不是值本身。

  

一般使用Rust迭代器

这取决于项目公开的迭代器。如果有某种可变引用的迭代器,那么是的。