从切片构建固定大小数组的函数

3

相关文章: 将切片转换为固定大小的数组,但我正在寻找更具体的形式。

理想情况下,我希望构建一个具有以下签名的函数:

fn make_array<T; N>(slice: &[T]) -> [T; N];

由于目前不支持非类型参数,因此我考虑直接将数组作为函数的输入参数:

fn make_array<A>(slice: &[T]) -> A;

需要将A替换为[T; N]

到目前为止,这是我最有希望的尝试:

use std::ops::DerefMut;

fn make_array<A, T>(slice: &[T]) -> A
    where A: Sized + Default + DerefMut<Target = [T]>
{
    let mut a = Default::default();
    (&mut a[..]).copy_from_slice(slice);
    a
}

fn main() {
    let original = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

    let a: [u8; 4] = make_array(&original[0..4]);

    println!("{:?}", a);
}

然而,我缺少一种将数组强制转换为切片的特性(提示:它不是 DerefMut)。

只要函数仅适用于小型数组,是否有一种使用安全代码构建此类函数的方法?

1个回答

7

AsMut(或BorrowMut)的工作方式:

use std::convert::AsMut;

fn make_array<A, T>(slice: &[T]) -> A
    where A: Sized + Default + AsMut<[T]>,
          T: Copy
{
    let mut a = Default::default();
    // the type cannot be inferred!
    // a.as_mut().copy_from_slice(slice);
    <A as AsMut<[T]>>::as_mut(&mut a).copy_from_slice(slice);
    a
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接