Quelle est la justification de conception pour fournir une fonction iter_mut
pour HashMap
mais pas HashSet
dans Rust?Pourquoi HashMap a-t-il iter_mut() mais pas HashSet?
Serait-ce un faux pas de rouler le sien (en supposant que cela peut même être fait)?
Avoir on pourrait atténuer les situations qui donnent lieu à
précédent
X
emprunt se produit ici; l'immuable empêche emprunter mouvements ultérieurs ou emprunte mutables deX
jusqu'à la fin emprunter
Exemple
An extremely convoluted example (Gist) qui ne montre cas pas pourquoi le passage de paramètres est la façon dont il est. A un bref commentaire expliquant le point de la douleur:
use std::collections::HashSet;
fn derp(v: i32, unprocessed: &mut HashSet<i32>) {
if unprocessed.contains(&v) {
// Pretend that v has been processed
unprocessed.remove(&v);
}
}
fn herp(v: i32) {
let mut unprocessed: HashSet<i32> = HashSet::new();
unprocessed.insert(v);
// I need to iterate over the unprocessed values
while let Some(u) = unprocessed.iter().next() {
// And them pass them mutably to another function
// as I will process the values inside derp and
// remove them from the set.
//
// This is an extremely convoluted example but
// I need for derp to be a separate function
// as I will employ recursion there, as it is
// much more succinct than an iterative version.
derp(*u, &mut unprocessed);
}
}
fn main() {
println!("Hello, world!");
herp(10);
}
La déclaration
while let Some(u) = unprocessed.iter().next() {
est un emprunt immuable, d'où
derp(*u, &mut unprocessed);
est impossible que l'état brut ne peut pas être emprunté mutably. L'emprunt immuable ne se termine pas avant la fin de la boucle while.
J'ai essayé d'utiliser this as reference et j'ai fini par essayer de tromper le vérificateur d'emprunts par diverses permutations d'assignations, en fermant des accolades, mais en raison du couplage des expressions voulues, le problème demeure.
Notez que 'tout laisser entrer (u) = unprocessed.iter() suivant()' est équivalent à 'pour u in & –
Vous avez non transformées sont une autre question ici. Vous ne pouvez pas emprunter' mutably alors que non transformées sont itérer dessus/en y incluant des références. Pourquoi ne pas simplement avoir la boucle * consommer * non traitée et simplifier la logique de votre programme? –