相关:切片到固定大小的数组,但我正在寻找更具体的形式.
理想情况下,我想构建一个具有以下签名的函数:
fn make_array<T; N>(slice: &[T]) -> [T; N];
Run Code Online (Sandbox Code Playgroud)
因为这还不可能(因为非类型参数不是一个东西),我反而想到让函数直接接受数组:
fn make_array<A>(slice: &[T]) -> A;
Run Code Online (Sandbox Code Playgroud)
人们可以替代[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);
}
Run Code Online (Sandbox Code Playgroud)
但是我错过了允许将数组强制转换为切片的特性(提示:它不是DerefMut).
只要我可以将函数仅用于小数组,有没有办法使用安全代码构建这样的函数?
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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
449 次 |
| 最近记录: |