我想创建一个像这样的矢量数组
let v: [Vec<u8>; 10] = [Vec::new(); 10];
然而,编译器给了我这个错误:
错误:未对类型
实施特征core::kinds::Copy
collections::vec::Vec<u8>
答案 0 :(得分:12)
由于Rust的所有权模型,您不能对非[expr; N]
类型使用Copy
初始化语法 - 它只执行一次表达式,对于非Copy
类型,它不能只复制字节N次,它们必须只在一个地方拥有。
您需要:
明确写出十次:let v: [Vec<u8>; 10] = [vec![], vec![], vec![], vec![], vec![], vec![], vec![], vec![], vec![], vec![]]
或
使用向量而不是数组:std::iter::repeat(vec![]).take(10).collect::<Vec<_>>()
。
答案 1 :(得分:5)
您可以使用Default特征来使用默认值初始化数组:
let array: [Vec<u8>; 10] = Default::default();
有关有效的示例,请参见this playground。
答案 2 :(得分:0)
如果类型实现了Copy特征,则只能以这种方式实例化数组。此特征仅适用于可以逐字节复制的类型(由于向量指向堆,因此无法实现)。
这个问题的一个答案是array_init板条箱,它提供了更通用的方式以复杂的方式初始化数组。
let multi: [Vec<u8>; 10] = array_init::array_init(|_| vec![0; 24]);