我有一种情况需要一片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();
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我在这里缺少一些特殊的魔法吗?还是我遇到了一个错误?
答案 0 :(得分:0)
它不是切片,而是固定大小的数组。
您无法使用某些内容创建切片,因为切片只是属于其他内容(如数组或向量)的内存的“视图”。
Rust中的固定大小数组通常是无用的。那是因为Rust不支持带有整数参数的泛型类型,但Rust中的几乎所有东西都被实现为traits(泛型),因此它们不适用于数组。
您需要使用Vec
。
答案 1 :(得分:0)
使用 MaybeUninit
是我能想到的最好方法。其文档中的内容完全相同:initializing-an-array-element-by-element。
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) }
};
}