2017-08-05 1 views
1

J'ai un HashMap<u32, u32> et je l'utilise comme iterator:L'itération sur un itérateur et la mutation d'une valeur modifient-elles la valeur de la collection?

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

Cette compile et imprime les valeurs attendues, mais est-il réellement changer la valeur de la carte alors que je suis itérer, ou suis-je juste l'observation de la valeur réelle et la valeur est écrite après la fin de l'itérateur? Ai-je raison de supposer que la mutation en cours d'itération fonctionne avec les itérateurs de Rust en général?

Répondre

7

t-il réellement changer la valeur de la carte

Pas. En réalité; la carte n'existe plus:

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 

Vous avez a transféré la propriété de la carte et toutes les clés et les valeurs de l'itérateur. C'est parti. Notez que la carte n'est même pas déclarée mutable, donc vous ne pouvez pas y apporter de modifications.

Si vous voulait modifier toutes les valeurs, vous pouvez:

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

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

Notez comment nous avons maintenant une référence aux clés et des valeurs, pas la valeur elle-même.

avec itérateurs Rust en général

Cela dépend de ce itérateurs l'article expose. S'il y a un itérateur de références mutables, alors oui.