2017-08-05 65 views
1

我有一個HashMap<u32, u32>,我用它作爲一個迭代器:在迭代器上進行迭代並更改值會更改集合中的值嗎?

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

這將編譯並打印出的預期值,但它實際上改變地圖的價值,而我遍歷它,還是我只是將實際值遮蔽起來,並且在迭代器完成後寫入該值?

我是否正確地認爲迭代中的變異與Rust迭代器一起工作?

回答

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); 
} 

注意我們現在有一個參考的鍵和值,而不是價值本身。

鐵鏽迭代器一般

這取決於什麼迭代器項目公開。如果有某種可變引用的迭代器,那麼是的。