How to get a slice as an array in Rust?

arrays, rust

Solution

You can easily do this with the `TryInto` trait (which was stabilized in Rust 1.34):

// Before Rust 2021, you need to import the trait:
// use std::convert::TryInto;

fn pop(barry: &[u8]) -> [u8; 3] {
    barry.try_into().expect("slice with incorrect length")
}

But even better: there is no need to clone/copy your elements! It is actually possible to get a `&[u8; 3]` from a `&[u8]`:

fn pop(barry: &[u8]) -> &[u8; 3] {
    barry.try_into().expect("slice with incorrect length")
}

As mentioned in the other answers, you probably don't want to panic if the length of `barry` is not 3, but instead handle this error gracefully.

This works thanks to these impls of the related trait `TryFrom` (before Rust 1.47, these only existed for arrays up to length 32):

impl<'_, T, const N: usize> TryFrom<&'_ [T]> for [T; N]
where
    T: Copy, 

impl<'a, T, const N: usize> TryFrom<&'a [T]> for &'a [T; N]

impl<'a, T, const N: usize> TryFrom<&'a mut [T]> for &'a mut [T; N]

Problem

I have an array of an unknown size, and I would like to get a slice of that array and convert it to a statically sized array: ``` fn pop(barry: &[u8]) -> [u8; 3] { barry[0..3] // expected array `[u8; 3]`, found slice `[u8]` } ``` How would I do this?

Original source

Related problems