Is there a good way to convert a Vec
with size S
to an array of type [T; S]
? Specifically, I\'m using a function that returns
As of Rust 1.48:
use std::convert::TryInto;
fn demo<T>(v: Vec<T>) -> [T; 4] {
v.try_into()
.unwrap_or_else(|v: Vec<T>| panic!("Expected a Vec of length {} but it was {}", 4, v.len()))
}
Before that:
use std::convert::TryInto;
fn demo<T>(v: Vec<T>) -> [T; 4] {
let boxed_slice = v.into_boxed_slice();
let boxed_array: Box<[T; 4]> = match boxed_slice.try_into() {
Ok(ba) => ba,
Err(o) => panic!("Expected a Vec of length {} but it was {}", 4, o.len()),
};
*boxed_array
}
Arrays must be completely initialized, so you quickly run into concerns about what to do when you convert a vector with too many or too few elements into an array. This example simply panics.
Unfortunately, you currently can't parameterize over an array's length outside of the standard library. This means that each size would need to be a specialized implementation. In the future, something like this should work:
#![feature(const_generics)]
use std::convert::TryInto;
fn demo<T, const N: usize>(v: Vec<T>) -> [T; N] {
let boxed_slice = v.into_boxed_slice();
let boxed_array: Box<[T; N]> = match boxed_slice.try_into() {
Ok(ba) => ba,
Err(o) => panic!("Expected a Vec of length {} but it was {}", N, o.len()),
};
*boxed_array
}
See also: