从切片

时间:2016-06-07 11:55:37

标签: rust

相关:Slice to fixed-size array,但我正在寻找更具体的表格。

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

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

因为这还不可能(因为非类型参数不是一个东西),我反而想到让函数直接接受数组:

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

其中一个人会将[T; N]替换为A

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

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 个答案:

答案 0 :(得分:6)

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
}