2015-03-08 5 views
0

У меня есть ситуация, когда я хочу срез HashMaps с длиной среза, заданного константой. Как я могу инициализировать такого зверя?Как инициализировать фрагмент 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

'[type; length] 'не является * срезом * - это * массив *. Массивы имеют фиксированный размер во время компиляции. Срезы имеют только известную длину во время выполнения. – Shepmaster

+1

Возможный дубликат [Как инициализировать массив векторов?] (Http://stackoverflow.com/questions/27393166/how-do-ininialize-an-array-of-vectors) – Shepmaster

ответ

0

Это не кусочек, а массив фиксированного размера.

Вы не можете создать срез с некоторым контентом, потому что срез - это только «представление» в памяти, которая принадлежит чему-то другому (например, массиву или вектору).

Резервные массивы в ржавчине, как правило, бесполезны. Это связано с тем, что Rust не поддерживает общие типы с целыми аргументами, но почти все вещи в Rust реализованы как черты (generics), поэтому они не работают для массивов.

Вам необходимо использовать Vec.

Смежные вопросы