Есть ли хороший способ конвертировать Vec <T> в массив?

Есть ли хороший способ преобразовать Vec<T> с размером S в массив типа [T; S]? В частности, я использую функцию, которая возвращает 128-битный хэш как Vec<u8>, который всегда будет иметь длину 16, и я хотел бы иметь дело с хешем как [u8, 16].

Есть ли что-то встроенное, похожее на метод as_slice, который дает мне то, что я хочу, или я должен написать свою собственную функцию, которая выделяет массив фиксированного размера, итерации через векторное копирование каждого элемента и возвращает массив

Ответ 1

[S] Могу ли я написать свою собственную функцию, которая выделяет массив фиксированного размера, итерации через вектор, копирующий каждый элемент, и возвращает массив?

Да, это то, что вы должны делать.

На самом деле не имело бы смысла иметь метод для вектора, чтобы обеспечить это, поскольку вы в настоящее время не можете параметризовать длину массива. Это означало бы, что каждый размер должен быть специализированной реализацией (хотя макросы помогли бы шаблону). Кроме того, массивы должны быть полностью инициализированы, поэтому вы быстро столкнетесь с опасениями о том, что делать, когда вы конвертируете вектор с слишком большим количеством элементов или слишком мало элементов в массив.

Для полноты, вот небольшой пример того, как он мог выглядеть:

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
}

В идеале вы можете использовать clone_from_slice, но в настоящее время он нестабилен.