2015-05-23 10 views
9

Una matrice a lunghezza fissa di tipo nativo (o di un tipo che implementa l'Copy tratto) possono essere clonati in ruggine fino alla lunghezza di 32. Cioè, questo compila:Come clonare una matrice con una lunghezza maggiore di 32?

fn main() { 
    let source: [i32; 32] = [0; 32]; // length 32 
    let _cloned = source.clone(); 
} 

Ma questo doesn 't:

fn main() { 
    let source: [i32; 33] = [0; 33]; // length 33 
    let _cloned = source.clone(); // <-- compile error 
} 

infatti, l'trait Clone dichiara solo un metodo per ogni lunghezza generico array, da 0 a 32.

Qual è un modo efficiente e idiomatica clonare un generico array di lunghezza, dire , 33?

+0

C'è una ragione per cui non è possibile utilizzare un 'Vec' in questo caso? – Shepmaster

+2

Per tutti gli altri che eseguono "WTF", [ecco l'implementazione] (https://github.com/rust-lang/rust/blob/1.0.0/src/libcore/array.rs#L41) – remram

risposta

7

Non è possibile aggiungere impl Clone nel proprio codice. Questo problema verrà risolto a un certo punto, nel frattempo si può per lo più lavorare intorno ad esso con diversi quantità di sforzo:

  • Se v'è solo una variabile locale di un tipo concreto e il tipo è Copy (come in tuo esempio), si può semplicemente copiare piuttosto che clonazione, vale a dire, let _cloned = source;.
  • Se la matrice è un campo di una struttura che si desidera implementare Clone per (e derive non funziona), è ancora possibile implementare manualmente Clone e utilizzare il trucco precedente nell'implementazione.
  • Clonazione di array di non Copy tipi è più complicato, perché Clone può sicuro. Potresti scrivere [x[0].clone(), x[1].clone(), ...] per tutte le volte che vuoi, è un sacco di lavoro ma almeno è certo che sia corretto.
  • Se tutto il resto fallisce, è comunque possibile creare un wrapper newtype. Ciò richiede un bel po 'di codice per delegare tutti gli altri tratti di cui hai bisogno, ma poi puoi (ancora, manualmente) implementare Clone.
Problemi correlati