2016-06-07 79 views
2

相关: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)。

只要我没事的功能仅适用于小数组的工作,有没有建立安全使用代码这样的功能的方法吗?

回答

3

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 
}