Я не совсем уверен, чего вы пытаетесь достичь здесь, но исходя из того, что я вижу выше, то есть вы хотите изменить свое оригинальное graph
(потому что вы передаете это как изменчивое заимствование к вашей функции) и что у вас нет возвращаемого значения, и что ваш вопрос касается изменения хэш-карты - я предполагаю, что вы хотели бы, чтобы изменения были отражены в вашем исходном HashMap
. Так почему же вы клонируете это в первую очередь?
Если, с другой стороны, вы не хотите видоизменять свой оригинальный объект, то не передавайте его как изменчивое заимствование, но как неизменяемое. Затем создайте его клон, прежде чем начинать цикл, и используйте эту клонированную версию в своем алгоритме.
Проблема, с которой вы сталкиваетесь, возникает потому, что на каждой итерации вы клонируете исходный graph
, а не свой клонированный imut_graph
, т.е. на каждой итерации вы создаете новый HashMap
, который затем мутируете, затем Вы начинаете новый цикл и продолжаете проверять длину исходного, а затем снова клонируете оригинальный.
Итак, у вас есть два варианта:
use std::collections::HashMap;
fn mutated(map: &mut HashMap<i32, Vec<i32>>) {
map.insert(1, vec![4, 5, 6]);
}
fn cloned(map: &HashMap<i32, Vec<i32>>) -> HashMap<i32, Vec<i32>> {
let mut map = map.clone();
map.insert(2, vec![7, 8, 9]);
map
}
fn main() {
let mut map = HashMap::new();
map.insert(0, vec![1, 2, 3]);
println!("{:?}", cloned(&map));
mutated(&mut map);
println!("{:?}", map);
}
Что даст вам:
{0: [1, 2, 3], 2: [7, 8, 9]}
{0: [1, 2, 3], 1: [4, 5, 6]}