2016-06-07 80 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 
}