2014-12-10 15 views
14

Vorrei creare un array di vettori come questoCome inizializzare un array di vettori?

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

Tuttavia, il compilatore mi dà questo errore:

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

risposta

9

Non è possibile utilizzare la sintassi [expr; N] inizializzazione per i non Copy tipi a causa della Modello di proprietà di Rust: esegue l'espressione una sola volta e, per i tipi non-Copy, non può semplicemente copiare i byte N volte, ma devono essere di proprietà in un unico posto.

Sarà necessario uno:

  1. scriverlo esplicitamente dieci volte: let v: [Vec<u8>; 10] = [vec![], vec![], vec![], vec![], vec![], vec![], vec![], vec![], vec![], vec![]], o

  2. usare qualcosa come un vettore al posto della matrice: std::iter::repeat(vec![]).take(10).collect::<Vec<_>>().

+0

Capisco che Vec non implementa Copy e non è possibile a causa di ciò, ma perché? Dopo tutto un Vec è clonabile (o lo era almeno) e la maggior parte dei tipi lo sono, perché non usare il clone internamente? –

+1

'Copia' riguarda un tipo di dati rappresentato con precisione dai suoi byte, in modo che la copia dei byte sia sufficiente per copiare il valore. Questo non funzionerà per 'Vec' perché i dati effettivi sono memorizzati in un'allocazione di heap ricca deve essere di proprietà esclusiva. Una copia di memoria di un 'Vec' violerebbe la sicurezza della memoria. –

+1

Ho lo stesso problema nella gestione di un array di 256 vettori :( – mfirry

Problemi correlati