2014-12-10 6 views
14

Chciałbym utworzyć tablicę wektorów jak tenJak zainicjować tablicę wektorów?

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

Jednak kompilator daje mi ten błąd:

error: the trait core::kinds::Copy is not implemented for the type collections::vec::Vec<u8>

Odpowiedz

9

nie można używać składni [expr; N] inicjalizacji dla non- Copy typów powodu Model własności Rusta - wykonuje wyrażenie tylko jeden raz, a dla typów nie-Copy nie może po prostu skopiować bajtów N razy, muszą one należeć tylko do jednego miejsca.

Trzeba będzie albo:

  1. zapisz go jawnie dziesięciokrotnie: let v: [Vec<u8>; 10] = [vec![], vec![], vec![], vec![], vec![], vec![], vec![], vec![], vec![], vec![]] lub

  2. Zastosowanie coś wektora zamiast tablicy: std::iter::repeat(vec![]).take(10).collect::<Vec<_>>().

+0

Rozumiem, że Vec nie implementuje Copy i nie jest to możliwe z tego powodu, ale dlaczego tak jest? Po wszystkim Vec jest cloneable (lub był co najmniej) i większość typów, więc dlaczego nie używać klona wewnętrznie? –

+1

'Kopiuj' dotyczy tego, że typ danych jest dokładnie reprezentowany przez jego bajty, tak że wystarczy skopiować tylko bajty, aby skopiować wartość. Nie zrobi tego dla 'Vec', ponieważ rzeczywiste dane są przechowywane w bogate alokacji sterty muszą być własnością. Kopia pamięci 'Vec' narusza bezpieczeństwo pamięci. –

+1

Mam ten sam problem z obsługą tablicy 256 wektorów :( – mfirry