2015-04-10 12 views
11

Esiste un buon metodo per convertire un con una dimensione di S in un array di tipo [T; S]? In particolare, sto usando una funzione che restituisce un hash a 128 bit come Vec<u8>, che avrà sempre lunghezza 16, e vorrei trattare con l'hash come [u8, 16].C'è un buon modo per convertire un Vec <T> in un array?

C'è qualcosa di simile al metodo as_slice che mi dà quello che voglio, o dovrei scrivere la mia funzione che alloca una matrice a dimensione fissa, itera attraverso il vettore copiando ciascun elemento e restituisce l'array?

risposta

9

[S] dovrei scrivere la mia funzione che alloca una matrice di dimensioni fisse, itera attraverso il vettore che copia ciascun elemento e restituisce l'array?

Sì, questo è quello che dovresti fare.

Non avrebbe davvero senso avere un metodo su un vettore per fornire questo, poiché attualmente non è possibile parametrizzare sulla lunghezza di un array. Ciò significherebbe che ciascuna dimensione dovrebbe essere un'implementazione specializzata (sebbene i macro aiuterebbero lo standard). Inoltre, gli array devono essere completamente inizializzati, quindi ti preoccuperai rapidamente di cosa fare quando converti un vettore con troppi o troppo pochi elementi in un array.

Per completezza, ecco un piccolo esempio di come potrebbe apparire:

fn from_slice(bytes: &[u8]) -> [u8; 32] { 
    let mut a = [0; 32]; 
    for i in 0..a.len() { 
     // Panics if not enough input 
     a[i] = bytes[i]; 
    } 
    a 
} 

Idealmente, si potrebbe usare clone_from_slice, ma è attualmente instabile.

+5

Nota: sembra che "clone_from_slice" sia ora stabile. – ideasman42

Problemi correlati