如何将切片转换为数组引用?

问题描述 投票:3回答:3

我有一个&[u8],并希望把它变成一个没有复制的&[u8; 3]。它应该引用原始数组。我怎样才能做到这一点?

arrays rust slice
3个回答
6
投票

他们arrayref箱子实现了这一点。

这是一个例子,你当然可以用不同的方式使用它:

#[macro_use]
extern crate arrayref;

/// Get the first 3 elements of `bytes` as a reference to an array
/// **Panics** if `bytes` is too short.
fn first3(bytes: &[u8]) -> &[u8; 3] {
     array_ref![bytes, 0, 3]
}

7
投票

从Rust 1.34开始,你可以使用TryFrom / TryInto

use std::convert::TryFrom;

fn example(slice: &[u8]) {
    let array = <&[u8; 3]>::try_from(slice);
    println!("{:?}", array);
}

fn example_mut(slice: &mut [u8]) {
    let array = <&mut [u8; 3]>::try_from(slice);
    println!("{:?}", array);
}

6
投票

重新强调一下,如果没有不安全的代码,就无法做到这一点,因为直到运行时才知道切片中有三个元素。

fn slice_to_arr3<T>(slice: &[T]) -> Option<&[T; 3]> {
    if slice.len() == 3 {
        Some(unsafe { &*(slice as *const [T] as *const [T; 3]) })
    } else {
        None
    }
}

在实现const generics之前,这在数组的长度上不是通用的。

© www.soinside.com 2019 - 2024. All rights reserved.