rust - ps4 - ¿Hay una buena manera de convertir un Vec<T> a una matriz?
rust traduccion (1)
¿[S] debo escribir mi propia función que asigna una matriz de tamaño fijo, itera a través del vector copiando cada elemento y devuelve la matriz?
Sí, esto es lo que debes hacer.
Realmente no tendría sentido tener un método en un vector para proporcionar esto, ya que actualmente no puede parametrizar la longitud de una matriz. Eso significaría que cada tamaño tendría que ser una implementación especializada (aunque las macros ayudarían al boilerplate). Además, las matrices deben inicializarse completamente, por lo que rápidamente se encuentra con preocupaciones sobre qué hacer cuando convierte un vector con demasiados o muy pocos elementos en una matriz.
Para completar, aquí hay un pequeño ejemplo de cómo podría verse:
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 su tipo no implementa Copy
, no puede usar copy_from_slice
, por lo que tendría que usar clone_from_slice
en clone_from_slice
lugar.
Esta pregunta ya tiene una respuesta aquí:
- ¿Cómo obtener una rebanada como una matriz en Rust? 6 respuestas
¿Hay una buena manera de convertir un Vec<T>
con tamaño S
a una matriz de tipo [T; S]
[T; S]
? Específicamente, estoy usando una función que devuelve un hash de 128 bits como un Vec<u8>
, que siempre tendrá la longitud 16, y me gustaría tratar el hash como un [u8, 16]
.
¿Hay algo integrado en el método as_slice
que me dé lo que quiero o debo escribir mi propia función que asigna una matriz de tamaño fijo, itera a través del vector copiando cada elemento y devuelve la matriz?