I just came across the following code in Rust:
use std::collections::HashMap;
use std::sync::{Arc, Mutex};
fn main() {
let mut v1 = vec![HashMap::<i32, i32>::new(); 2];
v1[0].insert(0,0);
v1[1].insert(1,1);
println!("{:?}", v1);
let v2 = vec![Arc::new(Mutex::new(HashMap::<i32, i32>::new())); 2];
v2[0].lock().unwrap().insert(0,0);
v2[1].lock().unwrap().insert(1,1);
println!("{:?}", v2);
}
// outputs:
// [{0: 0}, {1: 1}]
// [Mutex { data: {0: 0, 1: 1} }, Mutex { data: {0: 0, 1: 1} }]
It's apparently v1 has 2 different HashMaps, while v2 has only one. How's that happened? Shouldn't v2 evaluates Arc::new(Mutex::new(HashMap::<i32, i32>::new())) twice (like v1 do) and thus create two different elements? Is it some kind of "lazy" evaluation somewhere?
Pardon my rust newbie question, thanks in advance!