如何初始化一片HashMaps?

时间:2015-03-08 03:46:03

标签: rust

我有一种情况需要一片HashMaps,片长由一个常量指定。我如何初始化这样的野兽?

use std::collections::HashMap;
use std::default::Default;

const LENGTH: usize = 10;

fn main() {
    let f: [HashMap<String, u32>; LENGTH] = ???;
}

我在???中尝试了几个版本的东西?点:

Default::default()
[HashMap::new(); LENGTH]
[Default::default(); LENGTH]
iter::repeat(HashMap::new()).take(LENGTH).collect().as_slice()

每个人都给我不同的错误:

test.rs:7:45: 7:61 error: the trait `core::default::Default` is not implemented for the type `[std::collections::hash::map::HashMap<collections::string::String, u32>; 10]` [E0277]
test.rs:7     let f: [HashMap<String, u32>; LENGTH] = Default::default();
                                                      ^~~~~~~~~~~~~~~~

test.rs:7:45: 7:69 error: the trait `core::marker::Copy` is not implemented for the type `std::collections::hash::map::HashMap<collections::string::String, u32>` [E0277]
test.rs:7     let f: [HashMap<String, u32>; LENGTH] = [HashMap::new(); LENGTH];
                                                      ^~~~~~~~~~~~~~~~~~~~~~~~

test.rs:7:45: 7:73 error: the trait `core::marker::Copy` is not implemented for the type `std::collections::hash::map::HashMap<collections::string::String, u32>` [E0277]
test.rs:7     let f: [HashMap<String, u32>; LENGTH] = [Default::default(); LENGTH];
                                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~

test.rs:8:45: 8:107 error: the type of this value must be known in this context
test.rs:8     let f: [HashMap<String, u32>; LENGTH] = iter::repeat(HashMap::new()).take(LENGTH).collect().as_slice();
                                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我在这里缺少一些特殊的魔法吗?还是我遇到了一个错误?

2 个答案:

答案 0 :(得分:0)

它不是切片,而是固定大小的数组。

您无法使用某些内容创建切片,因为切片只是属于其他内容(如数组或向量)的内存的“视图”。

Rust中的固定大小数组通常是无用的。那是因为Rust不支持带有整数参数的泛型类型,但Rust中的几乎所有东西都被实现为traits(泛型),因此它们不适用于数组。

您需要使用Vec

答案 1 :(得分:0)

使用 MaybeUninit 是我能想到的最好方法。其文档中的内容完全相同:initializing-an-array-element-by-element

playground

use std::collections::HashMap;
use std::mem::{MaybeUninit, transmute};

const LENGTH: usize = 10;

fn main() {
    let _data: [HashMap<String, u32>; LENGTH] = {
        let mut data: [MaybeUninit<HashMap<String, u32>>; LENGTH] = unsafe {
            MaybeUninit::uninit().assume_init()
        };

        for elem in &mut data[..] {
            *elem = MaybeUninit::new(HashMap::new());
        }

        unsafe { transmute::<_, [HashMap<String, u32>; LENGTH]>(data) }
    };
}