web-dev-qa-db-fra.com

Existe-t-il un bon moyen de convertir un Vec <T> en un tableau?

Existe-t-il un bon moyen de convertir un Vec<T> avec la taille S vers un tableau de type [T; S]? Plus précisément, j'utilise une fonction qui renvoie un hachage de 128 bits en tant que Vec<u8>, qui aura toujours une longueur de 16, et je voudrais traiter le hachage comme un [u8, 16].

Y a-t-il quelque chose de similaire au as_slice méthode qui me donne ce que je veux, ou devrais-je écrire ma propre fonction qui alloue un tableau de taille fixe, parcourt le vecteur en copiant chaque élément et retourne le tableau?

24
jgray

[S] devrais-je écrire ma propre fonction qui alloue un tableau de taille fixe, itère à travers le vecteur en copiant chaque élément et retourne le tableau?

Oui, c'est ce que vous devez faire.

Cela n'aurait pas vraiment de sens d'avoir une méthode sur un vecteur pour fournir cela, car vous ne pouvez actuellement pas paramétrer sur la longueur d'un tableau. Cela signifierait que chaque taille devrait être une implémentation spécialisée (bien que les macros aideraient le passe-partout). De plus, les tableaux doivent être complètement initialisés, vous devez donc rapidement vous demander quoi faire lorsque vous convertissez un vecteur avec trop ou trop peu d'éléments en tableau.

Pour être complet, voici un petit exemple de ce à quoi cela pourrait ressembler:

fn from_slice(bytes: &[u8]) -> [u8; 32] {
    let mut array = [0; 32];
    let bytes = &bytes[..array.len()]; // panics if not enough data
    array.copy_from_slice(bytes); 
    array
}

Si votre type n'implémente pas Copy, vous ne pouvez pas utiliser copy_from_slice , vous devez donc utiliser clone_from_slice à la place.

15
Shepmaster