`vec!` 什么时候创建不同的元素?

bay*_*amy 4 rust

我刚刚在 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} }]
Run Code Online (Sandbox Code Playgroud)

链接到 Rust 游乐场

它显然v1有 2 个不同的 HashMap,而v2只有一个。这是怎么回事?不应该v2评估Arc::new(Mutex::new(HashMap::<i32, i32>::new()))两次(就像v1do)从而创建两个不同的元素?这是某种“懒惰”的评估吗?

请原谅我的 rust 新手问题,提前致谢!

kmd*_*eko 9

vec![value; n]语法使用Clone复制的价值,填补了载体。该文档甚至提到这样的情景:

这将用于clone复制表达式,因此在使用具有非标准Clone实现的类型时应该小心。例如,vec![Rc::new(1); 5]将创建一个包含对同一个装箱整数值的五个引用的向量,而不是五个指向独立装箱整数的引用。