我有一个HashMap<u32, u32>
,我将它用作迭代器:
for (key, mut value) in map {
if value == 0u32 {
value = 1u32;
}
println!("{}", value);
}
这会编译并打印出预期的值,但它实际上是在迭代它的时候改变了地图中的值,还是我只是遮住了实际值并且在迭代器完成后写出了值?
我是否正确地假设迭代中的变异通常适用于Rust迭代器?
答案 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迭代器
这取决于项目公开的迭代器。如果有某种可变引用的迭代器,那么是的。