如何初始化向量数组?

时间:2014-12-10 04:05:07

标签: rust

我想创建一个像这样的矢量数组

let v: [Vec<u8>; 10] = [Vec::new(); 10];

然而,编译器给了我这个错误:

  

错误:未对类型core::kinds::Copy

实施特征collections::vec::Vec<u8>

3 个答案:

答案 0 :(得分:12)

由于Rust的所有权模型,您不能对非[expr; N]类型使用Copy初始化语法 - 它只执行一次表达式,对于非Copy类型,它不能只复制字节N次,它们必须只在一个地方拥有。

您需要:

  1. 明确写出十次:let v: [Vec<u8>; 10] = [vec![], vec![], vec![], vec![], vec![], vec![], vec![], vec![], vec![], vec![]]

  2. 使用向量而不是数组: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]);